gpt4 book ai didi

java - 提示HINT_PASS_DISTINCT_THROUGH可将PageRequest的每页返回的实体数量降低到低于配置的页面大小(PostgreSQL)

转载 作者:太空宇宙 更新时间:2023-11-04 09:41:33 25 4
gpt4 key购买 nike

我正在建立一个基于JPA规范的存储库实现,该实现使用jpa规范(基于RSQL过滤器字符串构造)来过滤结果,定义结果顺序并通过“ distinct”删除所有重复项,否则由于连接的表而将返回这些重复项。 “ JPA规范”构建器方法联接多个表并设置“ distinct”标志:

final Join<Object, Object> rootJoinedTags = root.join("tags", JoinType.LEFT);
final Join<Object, Object> rootJoinedLocations = root.join("location", JoinType.LEFT);
...
query.distinct(true);


为了允许按联接的表列进行排序,我对相关的存储库方法应用了“ HINT_PASS_DISTINCT_THROUGH”提示(否则,按联接的表列进行排序会返回一条错误,即“必须在SELECT DISTINCT查询中包括排序列”) 。

@QueryHints(value = {
@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false")
})
Page<SomeEntity> findAll(@Nullable Specification<SomeEntity> spec, Pageable pageable);


所述存储库方法的参数构造如下:

final Sort sort = getSort(searchFilter);
final Specification spec = getSpecificationIfPresent(searchFilter);
final PageRequest pageRequest = PageRequest.of(searchFilter.getPageNumber(), searchFilter.getLimit(), sort);

return eventRepository.findAll(spec, pageRequest);


进行这些更改之后,过滤和排序似乎可以按要求进行。但是,该提示似乎导致已经构造了结果页面之后才应用“与众不同”的过滤,从而将页面中返回的实体数从配置的“ size” PageRequest参数减少到过滤重复项后剩下的内容出来。例如,如果我们使用“ page = 0”和“ pageSize = 10”创建一个PageRequest,那么尽管数据库包含更多条目(确切地说是177个实体),但生成的Page可能仅返回5个“ SomeEntity”实例。这个案例)。如果我删除了提示,则返回的实体编号再次正确。

问题:有没有办法使相同的规范查询设置与正确大小的页面一起工作(可能会添加其他一些提示以在构造Page对象之前执行重复的过滤)?如果没有,那么我是否可以使用另一种方法来实现所需的基于规范的过滤,并采用联合列排序和“与众不同”的方式去除重复项?

PS:PostgreSQL是有问题的应用程序背后的数据库

最佳答案

这可能是题外话,但可能会对您有所帮助。

您可以通过将查询分为两部分来尝试解决此问题(父子实体的分页):


用于检索与给定条件匹配的ID的查询
通过前一个查询的结果ID检索实际实体的查询


我在以下博客文章中遇到了此解决方案:https://vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/

关于java - 提示HINT_PASS_DISTINCT_THROUGH可将PageRequest的每页返回的实体数量降低到低于配置的页面大小(PostgreSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55921415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com