Spring Data JPA 如何使用 Kotlin nulls 而不是 Optional

2022-09-01 05:41:22

我正在用Spring Data JPA和Kotlin编写Spring Boot应用程序,我注意到有以下方法:CrudRepository

Optional<T> findById(ID id);

不过,我使用的是 Kotlin,它处理 null 的方法比 .有谁知道我会如何将该方法转换为这样工作?Optional

fun findById(id: ID): T?

当我扩展自身并使用该签名创建存储库时,我收到错误:Repository

java.lang.ClassCastException: java.util.Optional cannot be cast to com.books.Book

答案 1

从Spring Data Lovelace SR4 / Spring Boot 2.1.2开始,Kotlin扩展现在提供了一种开箱即用的方法,可以在Spring Data中检索可为空的实体。CrudRepository.findByIdOrNull(id: ID): T? = findById(id).orElse(null)

如果出于性能原因,您希望避免使用包装器,请注意,您还可以使用函数创建自定义接口。查询执行是特定于存储的,但大多数都使用内部可为 null 的值,并且将避免包装器的成本。请注意,对于大多数用例,此开销应该可以忽略不计,因此建议使用内置扩展的方法。Optional<T>findFooById(id: ID): T?Optional<T>

有关详细信息,请参阅 DATACMNS-1346


答案 2

12/2018更新:

Spring Data框架即将进行的更改将使此答案过时。更新基本上与此答案相同:定义适当的扩展函数。有关更多详细信息,请参阅Sébastien Deleuze的答案

原答:

正如你正确指出的那样,在 Kotlin 中你不需要,因为以简洁的方式处理可空性是一种内置语言功能。Optional

您可以创建自己的扩展函数来实现所需的行为:

fun <T, ID> CrudRepository<T, ID>.findOne(id: ID): T? = findById(id).orElse(null)

并像这样使用它:

val fruit: Fruit? = fruitRepository.findOne(id)

感谢佐丹奴,他向我展示了一种使函数更简洁的方法。


推荐