如何解决仅当Pageable =未分页时,Hibernate重复项才在Spring JPA查询中产生结果
我有一个奇怪的Hibernate案例,它在JPA存储库上运行Spring Boot,根据我的Pageable实例是否未分页,是否会得到重复的结果...
我这样构造我的Pageable对象:
Pageable pageable;
if (size > 0) {
pageable = PageRequest.of(page,size,sort);
} else {
pageable = Pageable.unpaged()
}
对于确实具有大小的请求,将它们进行分页,我可以很好地恢复对象。对于未分页的请求,将复制结果对象。
基础查询有点复杂,其中包含一些访存联接和用于性能的计数查询:
@Query(value = "select etv from EventTriggerVersion etv "
+ "inner join fetch etv.eventTrigger et "
+ "left join fetch etv.eventRules rules "
+ "left join fetch rules.conditionSets conditionSets "
+ "left join fetch conditionSets.conditions conditions "
+ "left join fetch conditionSets.dayTimeConditions dayTimeConditions "
+ "left join fetch conditions.leftOperand leftOperand "
+ "left join fetch conditions.rightOperand rightOperand "
+ "left join fetch leftOperand.leftOperand leftLeftOperand "
+ "left join fetch leftOperand.rightOperand leftRightOperand "
+ "left join fetch rightOperand.leftOperand rightLeftOperand "
+ "left join fetch rightOperand.rightOperand rightRightOperand "
+ "where etv.latestVersion = true" + " and et.project.id = :projectId "
+ "and (:skipSearch = true or lower(et.name) like lower(concat('%',cast(:search as java.lang.String),'%'))) "
+ "and (cast(:changedAfter as java.util.Date) is null or etv.createdDate >= :changedAfter)",countQuery = "select count(etv) from EventTriggerVersion etv "
+ "inner join etv.eventTrigger et "
+ "where etv.latestVersion = true" + " and et.project.id = :projectId "
+ "and (:skipSearch = true or lower(et.name) like lower(concat('%','%'))) "
+ "and (cast(:changedAfter as java.util.Date) is null or etv.createdDate >= :changedAfter)"
)
Page<EventTriggerVersion> findLatestVersionsInProject(@Param("projectId") UUID projectId,@Param("skipSearch") Boolean skipSearch,@Param("search") String search,@Param("changedAfter") Date changedAfter,Pageable pageable);
现在,我 CAN 在查询中使用distinct
并设置@QueryHints(value = @QueryHint(name = HINT_PASS_DISTINCT_THROUGH,value = "false"))
来解决此问题,但这对于性能而言可能并不理想,我很好奇为什么这样做是必要的仅适用于未分页的页面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。