Spring数据JpaRepository分页和分组

时间:2019-04-10 13:03:19

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

在我的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;

我的问题是是否有更简便的方法还是我仍然需要自定义查询(我是否需要在Entity中移动自定义查询或使用命名查询?)?

3 个答案:

答案 0 :(得分:0)

当您要汇总结果时,通常使用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);

答案 1 :(得分:0)

https://www.techonthenet.com/oracle/group_by.php中所述:“ Oracle GROUP BY子句在SELECT语句中用于收集多条记录中的数据并将结果按一个或多个列分组”并具有以下语法:

"Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" }}, "SignalR": { "messageHub": "http://localhost:5001/messageHub" }, "Api": { "GenerateTokenUrl": "http://localhost:5000/api/Values" }

您的查询中缺少诸如 SUM,COUNT,MIN,MAX AVG 之类的gregation_function。

答案 2 :(得分:0)

忽略了为什么不进行汇总的分组依据,我找到了解决方案:

videoPlayer.on('progress', checkBuffered);

function checkBuffered () {
  var buffPerc = videoPlayer.bufferedPercent();
  // rest of your code without setTimeout/setInterval
}

似乎比native_query方法更直接。

有用的link