当前位置: 首页 > 面试题库 >

使用Spring Data JpaRepository按计数排序

曾云
2023-03-14
问题内容

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

我需要按相关集合的大小排序。例如,我有:

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

我必须排序 bes.size()

有没有办法通过分页,过滤和其他Spring Data强大功能来自定义排序?


问题答案:

关于spring-data,我尚未意识到的第一件事也是最重要的一点是,即使使用@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);
}

…以及一些服务级别的附加条件逻辑(可能可以用抽象存储库实现封装)。因此,尽管不是很优雅,但这还是成功的秘诀-
通过这种方式(具有更复杂的实体),我可以按其他属性进行排序,进行过滤和分页。



 类似资料:
  • 我使用的是Spring数据JpaRepository,我发现它非常容易使用。我实际上需要所有这些功能——分页、排序、过滤。不幸的是,有一件令人讨厌的事情似乎迫使我退回到普通JPA的使用上来。 我需要按关联集合的大小订购。例如,我有: 我必须按bes排序。size() 是否有办法以某种方式自定义排序,仍然利用分页、过滤和其他Spring Data的强大功能?

  • 我有一张这样的桌子: 我想按组排序,然后按count(名称)排序,然后按rand()排序,结果如下: 我写了这个查询,但是如果我在group和rand之间添加count(Name),它会给我一个坏结果

  • 问题内容: 我有以下ES内容,基本上是网站中包含嵌套商品的产品列表。 如何按站点详细信息的数量排序? tnx! 问题答案: 从问题的示例来看,它看起来像是单个文档,但是单个json文档不可能在同一级别具有相同名称的多个字段。 因此,假设每个字段代表一个不同的顶级文档

  • 我知道Stack中有很多这样的实现,但我遇到了一个我无法处理的问题。 首先,我用javascript在khanacademy实现了合并排序,然后我将代码重写为C,并尝试计算数组中的反转次数。 我尽我所能,花了一个小时试图了解我做错了什么。我确实在堆栈中搜索了另一个实现,并试图纠正我的代码。不幸的是,我不知道我做错了什么。我想我计算每一个反转。提前感谢您帮助您了解问题所在。 我的代码: 合并排序函数

  • 本文向大家介绍计数排序,包括了计数排序的使用技巧和注意事项,需要的朋友参考一下 计数排序是一种稳定的排序技术,用于根据较小的键对对象进行排序。它计算键值相同的键的数量。当不同键之间的差异不太大时,此排序技术非常有效,否则会增加空间复杂度。 计数排序技术的复杂性 时间复杂度:O(n + r) 空间复杂度:O(n + r) 输入输出 算法 输入:数据数组,数组中的总数 输出:排序后的数组 示例 输出结