首页 > 解决方案 > Spring Boot @Query Annotation countQuery 有效,但 countName 无效

问题描述

我正在尝试使用@Query带有 Spring 的注释执行一些本机查询,但遇到以下问题:

我有一个文件名为:jpa-named-queries.properties我在其中放置查询,我有一个查询来获取数据,一个查询来计算数据。乙:

Find.members.team = SELECT ct.id teamId, r.user_id userId, (SELECT SUM(rd.resume_value) FROM resume_detail rd WHERE rd.resume_id = r.id) resumeMemberValue FROM resume r INNER JOIN challenge_team ct ON r.team_id = ct.id WHERE ct.id = :teamId ORDER BY resumeMemberValue ASC
Find.members.team.count = SELECT count(resume.id) FROM resume INNER JOIN challenge_team ct ON resume.team_id = ct.id WHERE ct.id = :teamId

我有 Repository 方法来使用查询:

@Query(name = "Find.members.team", 
       countName= "Find.members.team.count",  
       nativeQuery = true)
Page<TeamMemberProjection> findMembersTeamByIdWithPagination(@Param("teamId") Long id, Pageable pageable);

问题是如果我如上所示执行,则执行的查询是:

Hibernate: SELECT ct.id teamId, r.user_id userId, (SELECT SUM(rd.resume_value) FROM resume_detail rd WHERE rd.resume_id = r.id) resumeMemberValue FROM resume r INNER JOIN challenge_team ct ON r.team_id = ct.id WHERE ct.id = ? ORDER BY resumeMemberValue ASC limit ?
Hibernate: select count(rd) FROM resume_detail rd WHERE rd.resume_id = r.id) resumeMemberValue FROM resume r INNER JOIN challenge_team ct ON r.team_id = ct.id WHERE ct.id = ?

这会导致异常,因为执行的查询没有意义。

但是,如果我使用注释的countQuery属性,例如:

@Query(name = "Find.members.team", 
       countQuery= "SELECT count(resume.id) FROM resume INNER JOIN challenge_team ct ON resume.team_id = ct.id WHERE ct.id = :teamId",  
       nativeQuery = true)
Page<TeamMemberProjection> findMembersTeamByIdWithPagination(@Param("teamId") Long id, Pageable pageable);

The queries executed are:
Hibernate: SELECT ct.id teamId, r.user_id userId, (SELECT SUM(rd.resume_value) FROM resume_detail rd WHERE rd.resume_id = r.id) resumeMemberValue FROM resume r INNER JOIN challenge_team ct ON r.team_id = ct.id WHERE ct.id = ? ORDER BY resumeMemberValue ASC limit ?
Hibernate: SELECT count(resume.id) FROM resume INNER JOIN challenge_team ct ON resume.team_id = ct.id WHERE ct.id = ?

这非常有效。

这些属性的文档告诉: countName

Returns the name of the javax.persistence.NamedQuery to be used to execute count queries when pagination is used. Will default to the named query name configured suffixed by .count.

计数查询

Returns the name of the javax.persistence.NamedQuery to be used to execute count queries when pagination is used. Will default to the named query name configured suffixed by .count.

我在其他示例中一起使用了这两个属性并且工作得很好但是在这种特殊情况下我不明白我在做什么错误。

标签: javaspringhibernatespring-bootjpa

解决方案


推荐阅读