在JPA中获得单行

时间:2017-05-25 06:18:00

标签: java spring-data-jpa jpql

如何从JPA中的实体获取单行?

表:员工

    @Id
    private int empId;
    private String empName;
    ...    

JPA默认返回List。我试图获取单行。

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);

我如何确保它返回单行和正确的结果。 任何帮助表示感谢..提前致谢。

5 个答案:

答案 0 :(得分:5)

有一个开箱即用的解决方案,在存储库中,您可以将方法命名为findFirstBy...findTopBy...,这应该可以做到。

您可以在Spring reference documentation

中找到更多信息

答案 1 :(得分:4)

您无需“确保”任何事情。

如果您没有指定为返回的排序集合(例如List<Employee>而不是Employee),并且您的查询返回多个结果,则会启动javax.persistence.NonUniqueResultException: result returns more than one elements

如果您的查询返回更多行,并且您只希望其中一行添加条件以区分您实际需要的哪一行,或者如果它们相同,则添加一个好的旧distinct

  

我如何确保它返回单行并找到正确的结果。

在编写查询时,这是你的工作

答案 2 :(得分:0)

如果您只想从结果集中选择一行,则可以使用 query.setMaxResults 方法限制记录数:创建jpa查询时。

示例:criteria.setMaxResults(25); :它只能从100条记录中获取25条记录。

答案 3 :(得分:0)

JPA有一种获取单行getSingleResult的方法,但建议您获取列表并在getResultList上提取第一个元素。

请参阅:Example

答案 4 :(得分:0)

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

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

由于这是一个流,我想是逐行获取行(或者更确切地说是:Objects)。