Spring Data JPA @Query-无法为结果图创建“ AS”别名

时间:2019-03-05 14:57:00

标签: spring hibernate spring-boot jpa spring-data-jpa

我将以下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子句,映射将按预期工作。

2 个答案:

答案 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是多余的。