如何使用 Kotlin 在 Spring JPA 中正确查询实体
Posted
技术标签:
【中文标题】如何使用 Kotlin 在 Spring JPA 中正确查询实体【英文标题】:How to properly query entities in Spring JPA with Kotlin 【发布时间】:2018-12-05 14:39:40 【问题描述】:我正在将我的应用程序迁移到最新的 Spring Data 并且我正在努力正确地做到这一点。
假设我有一个只有一种方法的存储库,以便另外按名称查询我的实体:
@Repository
interface FooRepository : JpaRepository<Foo, Long>
fun findByName(name: String): Foo
根据文档,在这种情况下 - 如果找不到实体 - 将抛出 EmptyResultDataAccessException
。
但是,我还希望能够通过 id 查询实体。如果我使用findById
,结果将是Optional<Foo>
。另一种选择是使用getOne
,另一方面,如果找不到,则会导致EntityNotFoundException
。
那么,除了将所有内容移至 Optional
之外,还有什么方法可以在 Kotlin 中拥有统一的 API?
【问题讨论】:
【参考方案1】:您应该使用 问号,并将您的查询方法的返回类型与 可选“等效”:
interface FooRepository : JpaRepository<Foo, Long>
fun findByName(name: String): Foo?
然后你可以使用elvis-operator的方法:
val foo = repo.findByName("bar") ?: Foo("bar")
repo.findByName("bar") ?: throw IllegalArgumentException("foo not found")
更多信息:Kotlin’s java.util.Optional API Equivalents
【讨论】:
我知道,但findById
仍然会使用 Optional
公开不同的 API - 我正在寻找一种通过 id 和 name 查询的统一方式
使用可空类型与可选类型不同。它很相似,但 Optional 是一个包装器,其中 nullable 是一个类,或者不是一个类。此外,您仍然可以在 Kotlin 中访问 Optional。
这个问题中接受的答案有一个解决方法***.com/questions/47143127/…
不,你不能这样使用。它肯定会失败。以上是关于如何使用 Kotlin 在 Spring JPA 中正确查询实体的主要内容,如果未能解决你的问题,请参考以下文章
Spring JPA/Hibernate Repository findAll 在 Kotlin 中默认执行 N+1 个请求而不是 JOIN
JPA 自动完成功能在 Intellij spring-boot kotlin 项目中不起作用
如何在 Kotlin 中使用 JPA ManyToMany 双向关系
如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组