如何使用 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&lt;Foo&gt;。另一种选择是使用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 数组

Spring Boot - Jpa Distinct 和 Pageable

Kotlin copy() 函数正在 JPA 实体上创建一个新 ID,从而产生一个新行