Spring data JpaRepository разбиение на страницы и группировка по

В моем интерфейсе JpaRepository я получил следующий метод, который отлично работает:

Page<PermissionRule> findByOrganizationIdAndTypeStringAndObjectReferenceIgnoreCaseContaining(
        Long organizationId, String typeId, String searchTerm, Pageable pageable);

Мне нужен тот же запрос с группой по object_reference.

Вот что я пытался сделать: РЕДАКТИРОВАТЬ

@Query(value = "SELECT object_reference, dst_type, other FROM permission_rule pr WHERE pr.organization_id = %?1% AND pr.dst_type_id = %?2% AND pr.object_reference LIKE %?3% GROUP BY object_reference", nativeQuery = true)
Page<PermissionRule> getFunds(Long organizationId, String dstTypeId, String searchTerm, Pageable pageable);

но я получаю следующую ошибку

InvalidJpaQueryMethodException: Cannot use native queries with dynamic sorting and/or pagination in method

Также, если это поможет моему столбцу сущности, который я хочу использовать в GROUP BY,

@Column(name = "object_reference", nullable = false)
private String objectReference;

Мой вопрос заключается в том, есть ли более простой способ сделать это, или мне все еще нужен пользовательский запрос (может быть, мне нужно переместить пользовательский запрос в Entity или вместо этого использовать именованный запрос?)?

Думаю, эта ссылка может вам помочь.

hamed 10.04.2019 15:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
10 193
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обычно вы используете groupBy, когда хотите агрегировать результаты. Здесь вы делаете select * вместо агрегации.

@Query("SELECT l.someCol, count(*) as numOfRows from SomeTable l GROUP BY l.someCol")
    Page<Something> findSomething(Pageable pageable);

Объект Something может быть интерфейсом с методами получения для someCol и numOfRows.

Если вы используете собственный запрос, вам нужно использовать countQuery

@Query(value = "SELECT someCol, count(*) as numRows from SomeTable GROUP BY someCol",
            countQuery= "SELECT count(*) FROM (SELECT someCol, count(*) as numRows from SomeTable GROUP BY someCol)",
            nativeQuery=true)
    Page<Something> findSomething(Pageable pageable);

Вероятно, вам нужно использовать countQuery для разбивки на страницы, чтобы работать с собственным запросом.

Deepak Khillare 10.04.2019 16:40

Как указано в https://www.techonthenet.com/oracle/group_by.php: «Предложение Oracle GROUP BY используется в операторе SELECT для сбора данных по нескольким записям и группировки результатов по одному или нескольким столбцам» и имеет следующий синтаксис:

SELECT expression1, expression2, ... expression_n, aggregate_function (aggregate_expression) FROM tables [WHERE conditions] GROUP BY expression1, expression2, ... expression_n;

В вашем запросе отсутствует агрегатная_функция, такая как СУММА, СЧЕТ, МИН., МАКС. или СРЕДНИЙ.

Ответ принят как подходящий

Игнорируя, почему мне нужно делать Group By без агрегата, я нашел свое решение:

@Query("SELECT pr FROM PermissionRule pr WHERE pr.organizationId = ?1 AND pr.type = ?2 GROUP BY objectReference")
Page<PermissionRule> getFunds(Long organizationId, String type, Pageable pageable);

Кажется более прямым, чем подход native_query.

Полезное связь

Другие вопросы по теме