在 JPA 中获取单行
Posted
技术标签:
【中文标题】在 JPA 中获取单行【英文标题】:Get single row in JPA 【发布时间】:2017-10-25 16:41:36 【问题描述】:如何从 JPA 中的实体获取单行?
表:员工
@Id
private int empId;
private String empName;
...
JPA 默认返回列表。我正在尝试获取单行。
EmployeeRepository:-
public Employee findByEmpName(String empName);
另一种方法是这样做,应该使用@Query。
@Query(value="select e from Employee e where empName = ?1 limit 1", nativeQuery=true)
public Employee findByEmpName(String empName);
我怎样才能确保它返回单行和正确的结果。 任何帮助表示赞赏.. 提前致谢。
【问题讨论】:
JPQL 没有“LIMIT”,任何基本的 JPA 文档都会告诉你,@Query
和 XXXRepository 与 JPA API 无关,它是 Spring Data JPA跨度>
【参考方案1】:
有一个开箱即用的解决方案,在存储库中,您可以将方法命名为 findFirstBy...
或 findTopBy...
,这应该可以解决问题。
您可以在Spring reference documentation找到更多信息
【讨论】:
【参考方案2】:你不需要“确保”任何事情。
如果您没有指定为返回的排序集合(例如 List<Employee>
而不是 Employee
)并且您的查询返回多个结果,它将启动 javax.persistence.NonUniqueResultException: result returns more than one elements
。
如果您的查询返回更多行并且您只想要其中一个,则添加一个条件来区分您真正想要的那些行,或者如果它们相同,则添加一个很好的旧distinct
如何确保它返回单行和正确的结果。
编写查询时这是你的工作
【讨论】:
不适用于@Query 和“nativeQuery = true”【参考方案3】:JPA 有一个获取单行 getSingleResult
的方法,但建议获取一个列表并提取 getResultList
上的第一个元素。
见:Example
【讨论】:
谢谢,getSingleResult 和 getResultList 可以在我们进行查询和使用 entitymanager 时使用。但这里我使用的是 JPARepository 查询方法。链接:docs.spring.io/spring-data/jpa/docs/current/reference/html/… @Akkave 我还没有使用过 Spring 的 JPARepository。请编辑您使用 Spring 的 JPARepository 的问题。【参考方案4】:如果您只想从结果集中选择一行,则可以使用 query.setMaxResults 方法限制记录数:在创建 jpa 查询时。
示例:criteria.setMaxResults(25); : 它只提取 100 条记录中的 25 条记录。
【讨论】:
感谢您的回复。 Im not using JPA Criteria API, I
m 使用 JPARepository。
您是否使用查询 dsl 创建查询?
看看这个***.com/questions/9314078/…也许能帮上忙【参考方案5】:
如果有人只需要使用 JpaRepository (spring-data-jpa) 从数据库中获取一行,我发现这非常有用:
repository.findAll().stream().findFirst().orElseThrow(...)
由于这是一个流,我认为行(或者更确切地说:对象)是逐行获取的。
【讨论】:
我认为这是一个非常繁重的解决方案,因为您首先要从故事中获取所有记录。这是一个流,但在您从数据库中获取所有内容之后。以上是关于在 JPA 中获取单行的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 php 和 mysql 在单行引导滑块中获取不同的数据结果
在 CodeIgniter 中使用 AJAX 从数据库中获取单行?
LINQ 查询在 C# 中使用实体框架获取单列和单行值而不使用 Where