Java Hibernate仅在Pageable=unpaged时在Spring JPA查询中复制结果

Java Hibernate仅在Pageable=unpaged时在Spring JPA查询中复制结果,java,spring,spring-boot,hibernate,jpa,Java,Spring,Spring Boot,Hibernate,Jpa,我有一个奇怪的Hibernate案例,它在JPA存储库上运行Spring Boot,根据我的可分页实例是否未分页,我会得到重复的结果 我的可分页对象是这样构造的: Pageable pageable; if (size > 0) { pageable = PageRequest.of(page, size, sort); } else { pageable = Pageable.unpaged() } 对于确实有大小的请求,因此它们被分页,我会很好地返回我的对象。对于未分

我有一个奇怪的Hibernate案例,它在JPA存储库上运行Spring Boot,根据我的可分页实例是否未分页,我会得到重复的结果

我的可分页对象是这样构造的:

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('%',cast(:search as java.lang.String),'%'))) "
            + "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);
@Query(value=“从EventTriggerVersion etv中选择etv”
+“内部联接获取etv.eventTrigger et”
+“left join fetch etv.eventRules规则”
+“left join fetch rules.ConditionSet条件集”
+“左连接获取条件集。条件”
+“left join fetch ConditionSet.dayTimeConditions dayTimeConditions”
+“左连接提取条件。左操作数左操作数”
+“左连接提取条件。右操作数右操作数”
+“左连接获取LeftOperator.LeftOperator LeftOperator”
+“左连接提取LeftOperator.RightOperator LeftRightOperator”
+“左连接获取RightOperator.LeftOperator RightLeftOperator”
+“左连接获取右操作数。右操作数右操作数”
+其中etv.latestVersion=true“+”和et.project.id=:projectId”
+和(:skipSearch=true或更低(et.name),如更低(concat(“%”),cast(:搜索为java.lang.String),“%”)
+“and(强制转换(:changedAfter as java.util.Date)为null或etv.createdDate>=:changedAfter)”,
countQuery=“从EventTriggerVersion etv中选择计数(etv)”
+“内部联接etv.eventTrigger et”
+其中etv.latestVersion=true“+”和et.project.id=:projectId”
+和(:skipSearch=true或更低(et.name),如更低(concat(“%”),cast(:搜索为java.lang.String),“%”)
+“和(强制转换(:changedAfter as java.util.Date)为null或etv.createdDate>=:changedAfter)”
)
Page findLatestVersionsInProject(@Param(“projectId”)UUID projectId,
@Param(“skipSearch”)布尔skipSearch、@Param(“search”)字符串搜索、@Param(“changedfter”)日期changedfter、,
可寻呼(可寻呼);
现在,我可以在查询和设置
@QueryHints(value=@QueryHint(name=HINT\u PASS\u distinct\u THROUGH,value=“false”)
中使用一个
distinct
来解决这个问题,但这对性能来说可能并不理想,我只是好奇为什么只有未分页的页面才需要这样做