В моем интерфейсе 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 или вместо этого использовать именованный запрос?)?
Обычно вы используете 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 для разбивки на страницы, чтобы работать с собственным запросом.
Как указано в 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.
Полезное связь
Думаю, эта ссылка может вам помочь.