如何从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);
我如何确保它返回单行和正确的结果。 任何帮助表示感谢..提前致谢。
答案 0 :(得分:5)
有一个开箱即用的解决方案,在存储库中,您可以将方法命名为findFirstBy...
或findTopBy...
,这应该可以做到。
答案 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)。