Spring Data JPA: проекция нарушается после добавления нумерации страниц - PullRequest
0 голосов
/ 17 мая 2018

У меня есть запрос, который использует проекции, он работает хорошо, пока тип возвращаемого значения 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

1 Ответ

0 голосов
/ 17 мая 2018

Попробуйте использовать «родные» данные Spring JPA проекции .

Это должно работать хорошо:

public interface MyProjection {
    String getProperty1();
    //...
}

Page<MyProjection> getDistinctAllBy(Pageable pageable);

Но если ваш запрос объединяет много таблиц, вы не сможетеиспользуйте нумерацию страниц без какой-либо боли (например: 1 , 2 )

ОБНОВЛЕНО

Попробуйте добавить параметр countQuery до @Query аннотация:

@Query(value = "select ...", countQuery = "select count(me) from MyEntiry me")
Page<MyDto> findEntities(Pageable pageable);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...