Spring data jpa @Query - невозможно создать псевдоним "AS" для карты результатов - PullRequest
1 голос
/ 05 марта 2019

Я отображаю результат следующего JPQL -Query непосредственно на 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 ]

3 голосов
/ 05 марта 2019

Агрегатные функции можно использовать как условие, используя 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 голос
/ 05 марта 2019

Удалите псевдоним, переместите условие в предложение HAVING, так как оно работает с агрегатным значением, и просто поместите туда выражение-счет.

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 лишнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...