在 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, Im 使用 JPARepository。 您是否使用查询 dsl 创建查询? 看看这个***.com/questions/9314078/…也许能帮上忙【参考方案5】:

如果有人只需要使用 JpaRepository (spring-data-jpa) 从数据库中获取一行,我发现这非常有用:

repository.findAll().stream().findFirst().orElseThrow(...)

由于这是一个流,我认为行(或者更确切地说:对象)是逐行获取的。

【讨论】:

我认为这是一个非常繁重的解决方案,因为您首先要从故事中获取所有记录。这是一个流,但在您从数据库中获取所有内容之后。

以上是关于在 JPA 中获取单行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 php 和 mysql 在单行引导滑块中获取不同的数据结果

在 CodeIgniter 中使用 AJAX 从数据库中获取单行?

LINQ 查询在 C# 中使用实体框架获取单列和单行值而不使用 Where

无法在单行 oracle 中获取所有匹配的 regex_substr

QT - 如何从 QTableView 中的单行获取值

无法在 Spring JPA 休眠中获取关系