[英]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.