Type-safe Queries for Kotlin

Extensions

Kotlin extensions 提供了扩展现有类并使其具附加功能的能力。Spring Data Kotlin API 使用这些扩展为现有的 Spring API 添加新的,特定的 Kotlin 便利性功能。

请记住,需要导入 Kotlin 扩展才能使用它们。类似于静态导入,在大多数情况下,IDE 应自动建议导入。

例如, Kotlin reified type parameters 提供针对 JVM generics type erasure 的解决方法,而 Spring Data 提供了一些扩展来利用此功能。这使得获得更好的 Kotlin API 成为可能。

要在 Java 中检索 SWCharacter 对象列表,您通常会编写以下内容:

Flux<SWCharacter> characters = template.query(SWCharacter.class).inTable("star-wars").all()

使用 Kotlin 和 Spring Data 扩展,您可以编写以下内容:

val characters = template.query<SWCharacter>().inTable("star-wars").all()
// or (both are equivalent)
val characters : Flux<SWCharacter> = template.query().inTable("star-wars").all()

与 Java 一样,Kotlin 中的 characters 是强类型的,但 Kotlin 的巧妙类型推断允许使用更简洁的语法。

Type-safe Queries for Kotlin

Kotlin 通过其语言语法及其扩展系统包含特定于领域的语言创建。Spring Data MongoDB 使用 Criteria 的 Kotlin 扩展,该扩展使用 Kotlin property references 构建类型安全查询。使用此扩展的查询通常具有更佳的可读性。Criteria 中大多数关键字都有一个匹配的 Kotlin 扩展,例如 inValuesregex

请考虑以下示例来说明类型安全查询:

import org.springframework.data.mongodb.core.query.*

mongoOperations.find<Book>(
  Query(Book::title isEqualTo "Moby-Dick")               1
)

mongoOperations.find<Book>(
  Query(titlePredicate = Book::title exists true)
)

mongoOperations.find<Book>(
  Query(
    Criteria().andOperator(
      Book::price gt 5,
      Book::price lt 10
    ))
)

// Binary operators
mongoOperations.find<BinaryMessage>(
  Query(BinaryMessage::payload bits { allClear(0b101) }) 2
)

// Nested Properties (i.e. refer to "book.author")
mongoOperations.find<Book>(
  Query(Book::author / Author::name regex "^H")          3
)
1 isEqualTo() 是一个中缀扩展函数,其接收器类型为 KProperty<T>,它返回 Criteria
2 对于按位运算符,传递一个 lambda 参数,您在其中调用 Criteria.BitwiseCriteriaOperators 的方法之一。
3 若要构造嵌套属性,请使用 / 字符(重载的运算符 div)。