У меня есть запрос, который использует проекции, он работает хорошо, пока тип возвращаемого значения List
, но он перестает работать после добавления нумерации страниц.
Вот рабочий код:
@Query("SELECT DISTINCT \n" +
" new com.mycompany.dto.MyDto(me.property1, me.property2, ...) \n" +
"FROM MyEntiry me...")
List<MyDto> findEntities();
Мне нужно расширить его, добавив нумерацию страниц, поэтому я изменил его на:
@Query("SELECT DISTINCT \n" +
" new com.mycompany.dto.MyDto(me.property1, me.property2, ...) \n" +
"FROM MyEntiry me...")
Page<MyDto> findEntities(Pageable pageable);
Как только я это сделаю, контекст начинает терпеть неудачу, потому что при синтаксическом анализе он вставляет select count(me)
между SELECT
и FROM
инструкциями, так что запрос становится недействительным :
SELECT DISTINCT
new com.mycompany.dto.MyDto(me.property1, me.property2, ...)
select count(me) FROM com.mycompany.MyEntiry me ...
Контекст не выполняется со следующим исключением:
Вызывается: org.hibernate.hql.internal.ast.QuerySyntaxException:
неожиданный токен: выберите возле строки 3, столбец 1 [SELECT DISTINCT new
com.mycompany.dto.MyDto (me.property1, me.property2, ...) выберите
считать (меня) ОТ com.mycompany.MyEntiry меня ...]
в org.hibernate.hql.internal.ast.QuerySyntaxException.convert (QuerySyntaxException.java:74)
в org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException (ErrorCounter.java:91)
в org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse (QueryTranslatorImpl.java:291)
в org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile (QueryTranslatorImpl.java:186)
в org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile (QueryTranslatorImpl.java:141)
в org.hibernate.engine.query.spi.HQLQueryPlan. (HQLQueryPlan.java:115)
в org.hibernate.engine.query.spi.HQLQueryPlan. (HQLQueryPlan.java:77)
в org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan (QueryPlanCache.java:153)
в org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan (AbstractSharedSessionContract.java:553)
в org.hibernate.internal.AbstractSharedSessionContract.createQuery (AbstractSharedSessionContract.java:662)
... еще 88
Вопрос: Как заставить это работать? Это ошибка Spring Data?
Примечание:
- Добавленный мной запрос упрощен, мой реальный запрос фактически собирает разные значения из разных таблиц, и я не могу реализовать его без проекций
- Я использую Spring Boot 1.5.8.RELEASE