gpt4 book ai didi

java - 使用 Spring Data JpaRepository 按计数排序

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:30 25 4
gpt4 key购买 nike

我正在使用 Spring Data JpaRepository,我发现它非常容易使用。我实际上需要所有这些功能——分页、排序、过滤。不幸的是,有一件令人讨厌的小事似乎迫使我退回到使用普通 JPA。

我需要按关联集合的大小进行排序。例如我有:

@Entity
public class A{
@Id
private long id;
@OneToMany
private List<B> bes;
//boilerplate
}

我必须按 bes.size()

排序

有没有办法以某种方式自定义排序,仍然利用分页、过滤和其他 Spring Data 强大功能?

最佳答案

我已经使用来自以下方面的提示和灵感解决了这个难题:

  1. Limiting resultset using @Query anotations通过 Koitoer
  2. How to order by count() in JPA通过 MicSim
  3. 自己进行详尽的实验

关于 我还没有意识到的第一件也是最重要的事情是,即使使用 @Query 自定义方法,仍然可以通过简单地将 Pageable 对象作为参数传递来创建分页查询。 spring-data 文档可能已经明确说明了这一点,因为它绝对不是显而易见的,但功能非常强大。

太好了,现在是第二个问题 - 我如何在 JPA 中按关联集合的大小实际对结果进行排序?我设法得出以下 JPQL:

select new package.AwithBCount(count(b.id) as bCount,c) from A a join a.bes b group by a

其中 AwithBCount 是查询结果实际映射到的类:

public class AwithBCount{
private Long bCount;
private A a;

public AwithBCount(Long bCount, A a){
this.bCount = bCount;
this.a = a;
}
//getters
}

很高兴我现在可以像下面这样简单地定义我的存储库

public interface ARepository extends JpaRepository<A, Long> {
@Query(
value = "select new package.AwithBCount(count(b.id) as bCount,c) from A a join a.bes b group by a",
countQuery = "select count(a) from A a"
)
Page<AwithBCount> findAllWithBCount(Pageable pageable);
}

我赶紧尝试我的解决方案。完美 - 页面已返回,但当我尝试按 bCount 排序时,我感到很失望。事实证明,由于这是一个 ARepository(不是 AwithBCount 存储库),spring-data 将尝试在 A 中查找 bCount 属性而不是 AwithBCount。所以最后我得到了三种自定义方法:

public interface ARepository extends JpaRepository<A, Long> {
@Query(
value = "select new package.AwithBCount(count(b.id) as bCount,c) from A a join a.bes b group by a",
countQuery = "select count(a) from A a"
)
Page<AwithBCount> findAllWithBCount(Pageable pageable);

@Query(
value = "select new package.AwithBCount(count(b.id) as bCount,c) from A a join a.bes b group by a order by bCount asc",
countQuery = "select count(a) from A a"
)
Page<AwithBCount> findAllWithBCountOrderByCountAsc(Pageable pageable);

@Query(
value = "select new package.AwithBCount(count(b.id) as bCount,c) from A a join a.bes b group by a order by bCount desc",
countQuery = "select count(a) from A a"
)
Page<AwithBCount> findAllWithBCountOrderByCountDesc(Pageable pageable);
}

...以及一些关于服务级别的附加条件逻辑(可能用抽象存储库实现封装)。因此,虽然不是非常优雅,但还是成功了 - 这样(具有更复杂的实体)我可以按其他属性排序,进行过滤和分页。

关于java - 使用 Spring Data JpaRepository 按计数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23136469/

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