如何在Kotlin中使用Spring JPA正确地查询实体

3
我正在将我的应用程序迁移到最新的Spring Data,但我无法正确地实现它。
假设我有一个仓库只有一个方法,为了通过名称附加查询我的实体:
@Repository
interface FooRepository : JpaRepository<Foo, Long> {
   fun findByName(name: String): Foo
}

根据文档,在这种情况下 - 如果未找到实体 - 将抛出 EmptyResultDataAccessException

然而,我也想能够通过id查询实体。如果我使用findById,结果将是Optional<Foo>。另一个选择是使用getOne,但如果未找到,则会导致EntityNotFoundException

那么,除了将所有内容移动到Optional之外,是否有其他方法可以在Kotlin中拥有统一的API?

1个回答

2

你应该在查询方法的返回类型中使用问号,作为'等效于Optional':

interface FooRepository : JpaRepository<Foo, Long> {
   fun findByName(name: String): Foo?
}

接下来,您可以使用Elvis运算符来使用您的方法:

val foo = repo.findByName("bar") ?: Foo("bar")
repo.findByName("bar") ?: throw IllegalArgumentException("foo not found")

更多信息: Kotlin的java.util.Optional API等价物


我知道,但是findById仍然会使用不同于Optional的API - 我正在寻找一种统一的按ID和名称查询的方法。 - pwolaq
使用可空类型并不等同于Optional。它们很相似,但Optional是一个包装器,而可空类型可以是一个类,也可以不是。此外,在Kotlin中仍然可以访问Optional。 - Zoe stands with Ukraine
这个问题的被接受答案有一个解决方法:https://dev59.com/NlYN5IYBdhLWcg3wopYD - Ena
不,你不能这样使用。它肯定会失败。 - JBarros35

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接