【问题标题】:Spring data JpaRepository pagination and group bySpring数据JpaRepository分页和分组
【发布时间】:2019-08-31 22:56:32
【问题描述】:

在我的 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:无法在方法中使用具有动态排序和/或分页的本机查询

另外,如果它有助于我想在 GROUP BY 中使用的实体列是

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

我的问题是是否有更简单的方法可以做到这一点,或者我仍然需要自定义查询(我是否需要在实体中移动自定义查询或使用命名查询?)?

【问题讨论】:

标签: java hibernate spring-data-jpa spring-data


【解决方案1】:

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、MAXAVG

【讨论】:

    【解决方案2】:

    当您想要汇总结果时,通常使用 groupBy。在这里,您正在执行 select * 而不是聚合。

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

    Something 对象可以是 someCol 和 numOfRows 的 getter 方法的接口。

    如果您使用的是原生查询,则需要使用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 进行分页才能使用原生查询。
    【解决方案3】:

    忽略为什么我需要在没有聚合的情况下进行分组,我找到了解决方案:

    @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 方法更直接。

    有用link

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 2015-01-03
      • 2020-03-04
      • 2014-08-01
      • 2015-07-24
      • 2021-01-23
      • 2015-10-01
      • 2013-12-20
      相关资源
      最近更新 更多