Spring Data JPA:在查询方法上使用@Query注释获取第一条记录

时间:2017-12-12 15:54:10

标签: jpa spring-data-jpa

我的查询方法返回实体列表:

@Query("select u from ProfileDMO p inner join p.userPrincipal u where p.id=:profileId")
    List<UserPrincipalDMO> findUserPrincipalByProfileId(@Param("profileId") long profileId);

我只需要第一个结果。目前,我使用List.get(int index)获取第一个元素。

有谁知道我应该如何更新我的查询方法以仅返回第一个结果?

1 个答案:

答案 0 :(得分:1)

更新回答:

如果您不能使用派生查询,其中Spring Data JPA从方法名称派生查询,您可以使用Pageable参数来限制结果,第二种方法使用默认实现来隐藏参数并打开结果:

@Query("select u from ProfileDMO p inner join p.userPrincipal u where p.id=:profileId")
List<UserPrincipalDMO> internalFindUserPrincipalByProfileId(@Param("profileId") long profileId, Pageable page);

default UserPrincipalDMO findUserPrincipalByProfileId(long profileId){
    return internalFindUserPrincipalByProfileId(
        profileId, 
        PageRequest.of(0,1)
    ).get(0);
};

当然,这会在您的API中留下内部实现,如果您不喜欢,那么您始终可以回退到自定义实现。

原始回答:

您应该能够使用查询派生,即删除@Query注释并将您的方法更改为:

UserPrincipalDMO findFirstByUserPrincipalProfileId(@Param("profileId") long profileId);

如果您不喜欢该名称,可以使用带有首选名称的默认方法并委托给我建议的名称。

如果您根本不想在界面中使用方法名称,则可以提供自定义实现。