web-dev-qa-db-ja.com

Spring Data JPA Optionalの代わりにKotlin nullsを使用する方法

私は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
20
CorayThan

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 を参照してください。

31

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 のおかげで、関数をより簡潔にする方法を教えてくれました。

16
Willi Mentzel