繁体   English   中英

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

[英]Spring Data JPA How to use Kotlin nulls instead of Optional

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

Optional<T> findById(ID id);

不过,我正在使用 Kotlin,它比Optional具有更流畅的处理空值的方式。 有谁知道我将如何将该方法转换为这样的工作?

fun findById(id: ID): T?

当我扩展Repository本身并使用该签名创建一个 repo 时,我收到错误消息:

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) CrudRepository.findByIdOrNull(id: ID): T? = findById(id).orElse(null) Kotlin 扩展现在提供了一种在 Spring Data 中检索可为空实体的开箱即用的方法。

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

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

12/2018 更新:

Spring Data 框架即将发生的变化将使这个答案过时。 更新基本上与此答案相同:定义适当的扩展功能。 有关更多详细信息,请参阅塞巴斯蒂安德勒兹的回答

原答案:

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

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

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

并像这样使用它:

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

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

塞巴斯蒂安德勒兹回答的简短版本:只需定义一个具有可为空返回类型函数

interface UserRepository : Repository<User, String> {

  // throws EmptyResultDataAccessException, if no user is found
  fun findByUsername(username: String): User     

  // return null, if no user is found
  fun findByFirstname(firstname: String?): User? 
}

请参阅 Spring 数据参考文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM