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 扩展,例如 inValues
和 regex
。
请考虑以下示例来说明类型安全查询:
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 )。 |