拡張

Kotlin 拡張機能 (英語) は、既存のクラスを追加機能で拡張する機能を提供します。Spring Data Kotlin API はこれらの拡張機能を使用して、既存の Spring API に新しい Kotlin 固有の便利な機能を追加します。

Kotlin 拡張機能を使用するには、インポートする必要があることに注意してください。静的インポートと同様に、ほとんどの場合、IDE は自動的にインポートを提案するはずです。

例: Kotlin の型パラメーターを具体化 (英語) は JVM ジェネリクス型消去 [Oracle] (英語) の回避策を提供し、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 の巧妙な型推論により、構文を短くすることができます。

Kotlin の型安全なクエリ

Kotlin は、言語構文と拡張システムを通じてドメイン固有の言語作成を採用しています。Spring Data MongoDB には、Kotlin プロパティの参照 (英語) を使用して型安全なクエリを構築する Criteria 用の Kotlin 拡張機能が付属しています。この拡張機能を使用するクエリは通常、可読性の向上による恩恵を受けます。Criteria のほとんどのキーワードには、inValues や regex など、一致する Kotlin 拡張子が付いています。

型安全なクエリを説明する次の例を考えてみましょう。

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)
)
1isEqualTo() は、Criteria を返すレシーバー型 KProperty<T> を持つ中置拡張関数です。
2 ビット演算子の場合は、Criteria.BitwiseCriteriaOperators のメソッドの 1 つを呼び出すラムダ引数を渡します。
3 ネストされたプロパティを構築するには、/ 文字 (オーバーロードされた演算子 div) を使用します。