我正在将我的应用程序迁移到最新的 Spring Data,但我正在努力正确地完成它。
假设我有一个只有一种方法的存储库,以便通过名称额外查询我的实体:
@Repository
interface FooRepository : JpaRepository<Foo, Long> {
fun findByName(name: String): Foo
}
根据文档,在这种情况下 - 如果未找到实体 - EmptyResultDataAccessException
将被抛出。
但是,我也希望能够通过 id 查询实体。如果我使用 findById
,结果将是 Optional<Foo>
.另一种选择是使用 getOne
,另一方面将导致 EntityNotFoundException
如果没有找到。
那么,除了将所有内容移动到 Optional
之外,还有什么办法吗? , 在 Kotlin 中拥有统一的 API?
最佳答案
您应该将问号与您的查询方法的返回类型一起使用作为“等同于”可选:
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")
关于spring - 如何使用 Kotlin 正确查询 Spring JPA 中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51050269/