Весенние данные JpaRepository разбиты на страницы и сгруппированы по - PullRequest
1 голос
/ 10 апреля 2019

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

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

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

Вот что я пытался сделать: EDIT

@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: невозможно использовать собственные запросы с динамической сортировкой и / или разбиением на страницы в методе

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

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

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

Ответы [ 3 ]

0 голосов
/ 10 апреля 2019

Как указано в 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;

В вашем запросе отсутствует агрегатная функция, такая как SUM, COUNT, MIN, MAX или AVG .

0 голосов
/ 10 апреля 2019

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

@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.

Полезно ссылка

0 голосов
/ 10 апреля 2019

Обычно вы используете 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);
...