【问题标题】:How to properly query entities in Spring JPA with Kotlin如何使用 Kotlin 在 Spring JPA 中正确查询实体
【发布时间】:2018-12-05 14:39:40
【问题描述】:

我正在将我的应用程序迁移到最新的 Spring Data 并且我正在努力正确地做到这一点。

假设我有一个只有一种方法的存储库,以便另外按名称查询我的实体:

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

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

但是,我还希望能够通过 id 查询实体。如果我使用findById,结果将是Optional&lt;Foo&gt;。另一种选择是使用getOne,另一方面,如果找不到,则会导致EntityNotFoundException

那么,除了将所有内容移至 Optional 之外,还有什么方法可以在 Kotlin 中拥有统一的 API?

【问题讨论】:

    标签: spring kotlin spring-data-jpa spring-data


    【解决方案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。
    • 这个问题中接受的答案有一个解决方法stackoverflow.com/questions/47143127/…
    • 不,你不能这样使用。它肯定会失败。
    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2019-12-31
    • 2018-09-27
    • 2018-09-18
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多