【问题标题】:Get single row in JPA在 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跨度>

标签: java spring-data-jpa jpql


【解决方案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 条记录。

    【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

    • 我认为这是一个非常繁重的解决方案,因为您首先要从故事中获取所有记录。这是一个流,但在您从数据库中获取所有内容之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2011-03-15
    相关资源
    最近更新 更多