我将以下JPQL
查询的结果直接映射到SpecialCustomDto
对象,而不是使用的javax.persistency
实体对象MyEntity
。但是我不知道如何访问COUNT(DISTINCT e.attributeB)
,它将被映射到SpecialCustomDto
。
这是查询。
@Repository
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
@Query("SELECT new com.test.SpecialCustomDto(e.attributeA, COUNT(DISTINCT e.attributeB)) as specialCustomDto "
+ "FROM MyEntity e WHERE 5 = specialCustomDto.count GROUP BY e.attributeA")
List<SpecialCustomDto> getSpecialCustomDtos();
}
一旦我启动spring-boot
应用程序,Hibernate就会向我抛出以下错误:
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: as near line 1, column...
我不知道如何访问新创建的COUNT(DISTINCT e.attributeB)
的聚合SpecialCustomDto
元素。没有附加的WHERE
子句,映射将按预期工作。
答案 0 :(得分:3)
可以使用HAVING
将集合函数用作条件。与本机SQL中的相同。
SELECT new com.test.SpecialCustomDto(e.attributeA, COUNT(e.attributeB))
FROM MyEntity e
GROUP BY e.attributeA
HAVING COUNT(e.attributeB) = 5
答案 1 :(得分:1)
删除别名,将条件移至HAVING子句,因为它对聚合值进行运算,然后将count-expression放在其中。
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
@Query("SELECT new com.test.SpecialCustomDto(e.attributeA, COUNT(DISTINCT e.attributeB)) "
+ "FROM MyEntity e "
+ "GROUP BY e.attributeA "
+ "HAVING COUNT(DISTINCT e.attributeB) = 5")
List<SpecialCustomDto> getSpecialCustomDtos();
}
注意:@Repository
是多余的。