Spring-Data FETCH JOIN with Paging не работает

Я пытаюсь использовать HQL, получая мою сущность вместе с суб-сущностями, используя JOIN FETCH, это работает нормально, если я хочу все результаты, но это не так, если я хочу страницу

Моя сущность

@Entity @Data public class VisitEntity { @Id @Audited private long id; . . . @OneToMany(cascade = CascadeType.ALL,) private List comments; } 

и потому, что у меня есть миллионы посещений, мне нужно использовать «Pageable», и я хочу «Получить комментарии» в одном запросе базы данных, например:

 @Query("SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and ..." ) public Page getVenueVisits(@Param("venueId") long venueId,..., Pageable pageable); 

Этот вызов HQL вызывает следующее исключение:

 Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=com.ro.lib.visit.entity.VisitEntity.comments,tableName=visitdb.visit_comment,tableAlias=comments1_,origin=visitdb.visit visitentit0_,columns={visitentit0_.visit_id ,className=com.ro.lib.visit.entity.VisitCommentEntity}}] [select count(v) FROM com.ro.lib.visit.entity.VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and (v.actualArrival > :date or v.arrival > :date)] at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:309) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

и как только я удаляю пейджинг, все работает нормально

 @Query("SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and ..." ) public List getVenueVisits(@Param("venueId") long venueId,...); 

Очевидно, проблема связана с запросом count от Spring-Data, но как мы можем его исправить?

Самый простой способ – использовать атрибут @Query annotations @Query для предоставления пользовательского запроса для использования.

 @Query(value = "SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments …", countQuery = "select count(v) from VisitEntity v where …") List getVenueVisits(@Param("venueId") long venueId, …); 

Вы должны указать параметр countQuery для @Query и теперь вы можете использовать Page или List как возвращаемое значение.

 @Query(value = "SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and ...", countQuery = "SELECT count(v) FROM VisitEntity v LEFT JOIN v.comments WHERE v.venue.id = :venueId and ..." ) public Page getVenueVisits(@Param("venueId") long venueId,..., Pageable pageable); 

Альтернативно, в новейших версиях Spring (поддерживая спецификацию JPA 2.1) вы можете использовать граф сущности следующим образом:

 @EntityGraph(attributePaths = "roles") @Query("FROM User user") Page findAllWithRoles(Pageable pageable); 

Разумеется, именованные диаграммы сущностей также работают.

  • Можно ли использовать исходный SQL в Spring Repository
  • Может ли Spring Data REST использовать QueryDSL для выполнения более сложных запросов?
  • Данные Spring jpa- Определен бит bean с именем 'entityManagerFactory'; Инъекция автоуведомленных зависимостей не удалась
  • Spring Data + JPA с несколькими источниками данных, но только один набор репозиториев
  • обновление логического значения в данных весны jpa с использованием @Query, с гибернацией
  • Запрос репозитория динамической пружины jpa с произвольными предложениями AND
  • В чем разница между интерфейсами CrudRepository и JpaRepository в Spring Data JPA?
  • Как проверить поддержку декларативного кэширования Spring в хранилищах Spring Data?
  • Как сохранить типы JSR-310 с помощью Spring Data JPA?
  • Обработка мягких удалений с помощью Spring JPA
  • Spring-Data-Jpa Repository - Подчеркивание имени столбца объекта
  • Interesting Posts

    Dlink DIR-615 неожиданно перестает работать – оранжевый интернет-свет

    Обновление проекта Gradle не удалось после обновления Android Studio

    Покрытие кода, не показывающее результаты с помощью Xcode + gcov

    Получить текущее имя каталога (без полного пути) в сценарии Bash

    AngularJS: Как создать скрипт с угловой загрузкой внутри ng-include?

    Как у меня нет веб-браузера по умолчанию, поэтому система спрашивает, какой браузер использовать, когда я нажимаю ссылку?

    Модификатор static разрешен только в объявлениях с постоянной переменной

    Объединение нескольких изображений с помощью ImageMagick

    Включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации ) на сервере

    В чем разница функций и методов в Go?

    Включение ProGuard в Eclipse для Android

    Математические операции в регулярном выражении

    Как отлаживать привязки событий JavaScript / jQuery к Firebug или аналогичным инструментам?

    Отдельные действия в разных программах

    Как добавить пользовательский вид в квоту annotations карты

    Давайте будем гением компьютера.