使用 JPA 进行嵌套属性排序时,结合 DISTINCT 和 ORDER BY

问题描述 投票:0回答:2

我有一个 JPQL 查询,正在寻找可分页的不同记录。在某些情况下,可分页排序将是嵌套类中的属性。

public class Entity1 {
  @Id
  private long id;
  
  @ManyToOne
  private Entity2 entity2;
}
public class Entity2 {
  @Id
  private long id;
  
  private String fieldToSort;
}
public interface Entity1Repository extends JpaRepository<Entity1, Long> {
  Page<Entity1> findDistinct(Pageable pageable);
}

如果我调用按

entity2
排序的查询,则会返回正确的结果。但是,当我尝试按
entity2.fieldToSort
排序时,出现以下错误:

ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list

如果我删除

DISTINCT
限制,查询运行正常,但会为每个
Entity1
返回一条
Entity2
记录。

当每个主要实体需要不同的记录时,处理按子字段排序的最佳方法是什么?

java spring-data-jpa jpql
2个回答
0
投票

您可以简单地使用 JOIN FETCH:

SELECT e1 FROM Entity1 e1 LEFT JOIN FETCH e1.entity2 e2.

将 JOIN 与 FETCH 结合使用,可以使用单个选择来初始化值的关联或集合及其父对象。

https://docs.jboss.org/hibernate/core/3.3/reference/en-US/html/queryhql.html#:~:text=A%20%22fetch%22%20join%20allows%20associations%20or %20collections%20of%20values%20to%20be%20initialized%20along%20with%20their%20parent%20objects%20using%20a%20single%20select.

这比编写子查询优雅得多。


-1
投票

通过在存储库中使用嵌套查询解决了这个问题:

@Query("select e1 from Entity1 e1 where e1 in (select e1 from Entity1 e1 left join e1.entity2 e2)")
Page<Entity1> findDistinctCustom(Pageable pageable);
© www.soinside.com 2019 - 2024. All rights reserved.