私はSpring Data JPAとKotlinを使ってSpring Bootアプリを書いていますが、CrudRepository
には次のメソッドがあることに気付きました:
Optional<T> findById(ID id);
ただし、Optional
よりもはるかに流nullにヌルを処理する方法があるKotlinを使用しています。このメソッドをこのように変換する方法を知っている人はいますか?
fun findById(id: ID): T?
Repository
自体を拡張し、その署名でリポジトリを作成すると、エラーが発生します。
Java.lang.ClassCastException: Java.util.Optional cannot be cast to com.books.Book
Spring Data Lovelace SR4/Spring Boot 2.1.2の時点で、CrudRepository.findByIdOrNull(id: ID): T? = findById(id).orElse(null)
Kotlin拡張機能は、Spring Dataでnullを許可するエンティティを取得する方法をすぐに提供するようになりました。
パフォーマンス上の理由で_Optional<T>
_ラッパーの使用を避けたい場合は、findFooById(id: ID): T?
関数を使用してカスタムインターフェイスを作成することもできることに注意してください。クエリの実行はストア固有ですが、ほとんどが内部的にNULL可能な値を使用しており、_Optional<T>
_ラッパーのコストを回避します。このオーバーヘッドは、ほとんどのユースケースでは無視できるはずなので、組み込みの拡張機能を使用することをお勧めします。
詳細については、 DATACMNS-1346 を参照してください。
2018年12月更新:
Spring Dataフレームワークの今後の変更により、この回答は廃止されます。更新は基本的にこの回答と同じです:適切な拡張関数を定義します。詳細については、 セバスチャンドゥルーズの答え を参照してください。
元の答え:
正しく述べたように、KotlinでOptional
は必要ありません。簡潔な方法でnull値を処理することは、言語機能のビルドです。
独自の拡張関数を作成して、目的の動作を実現できます。
fun <T, ID> CrudRepository<T, ID>.findOne(id: ID): T? = findById(id).orElse(null)
次のように使用します:
val fruit: Fruit? = fruitRepository.findOne(id)
Giordano のおかげで、関数をより簡潔にする方法を教えてくれました。