Java Spring数据jpa按嵌套对象集合大小排序

Java Spring数据jpa按嵌套对象集合大小排序,java,spring,spring-boot,spring-data-jpa,Java,Spring,Spring Boot,Spring Data Jpa,我使用的是spring启动应用程序,存在以下两个实体 Person.java @Entity @Data @EqualsAndHashCode(callSuper = true) @AllArgsConstructor @NoArgsConstructor @Table(name = "PERSON") public class Person extends BaseEntity { @NotNull @Enumerated(EnumType.STRING) privat

我使用的是spring启动应用程序,存在以下两个实体

Person.java

@Entity
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "PERSON")
public class Person extends BaseEntity {
    @NotNull
    @Enumerated(EnumType.STRING)
    private StatusType status;

    @JsonIgnore
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "PERSON_ADDRESS",
            joinColumns = @JoinColumn(
                    name = "person_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(
                    name = "address_id", referencedColumnName = "id"))
    private Collection<Info> addresses;
}
@Entity
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "ADDRESS")
public class Address extends BaseEntity {
    @NotNull
    private String address;

    @ManyToMany(mappedBy = "addresses")
    private Collection<Person> persons;
}
我使用下面的语句来实现分页和排序

Page<Person> allPersons = personRepository.findAll(pageable);
Page allPersons=personRepository.findAll(可分页);
其中
pageable
org.springframework.data.domain.pageable
的一个实例

我可以使用
Person
中的其他列进行排序。但是我想根据地址集合进行排序,根据每个
实体的
地址
记录的数量进行排序

简而言之,我想根据集合的集合大小对人员进行排序。分拣顺序(ASC或DESC)来自前端


你知道
Pageable
对象应该如何实现这一点吗?如果一个
人有多个
地址

的话,也不返回任何重复的
记录,下面是根据的解决方案

在我的实验中,我尝试如下定义存储库,但有一个问题;当我们在
PersonRepository
上定义查询以基于addressCount进行排序时,spring数据会查看Person

@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {

    @Query(
        value = "select p from Person p join p.addresses ad group by p",
        countQuery = "select count(p) from Person p"
    )
    Page <Person> findAllWithAddressCount(Pageable pageable);
}
@存储库
公共接口PersonRepository扩展了JpaRepository{
@质疑(
value=“从个人p中选择p,通过p加入p地址广告组”,
countQuery=“从人员p中选择计数(p)”
)
PageFindAllWithAddressCount(可分页可分页);
}
因此,作为一种解决方法,我尝试将排序逻辑转换为查询定义本身,最终为ASC和DESC模式提供了两个版本:

@Repository
public interface PersonRepository extends JpaRepository <Person, Long> {

    @Query(
        value = "select p from Person p join p.addresses ad group by p Order By addressCount asc",
        countQuery = "select count(p) from Person p"
    )
    Page<Person> findAllOrderByAddressCountAsc(Pageable pageable);

    @Query(
        value = "select p from Person p join p.addresses ad group by p Order By addressCount desc",
        countQuery = "select count(p) from Person p"
    )
    Page<Person> findAllOrderByAddressCountDesc(Pageable pageable);
}
@存储库
公共接口PersonRepository扩展了JpaRepository{
@质疑(
value=“从人员p中选择p按p顺序按地址加入p地址广告组按地址计数asc”,
countQuery=“从人员p中选择计数(p)”
)
PageFindAllowerByAddressCountAsc(可分页可分页);
@质疑(
value=“选择p从个人p加入p地址广告组按p顺序按地址计数描述”,
countQuery=“从人员p中选择计数(p)”
)
Page FindAllowerByAddressCountDesc(可分页可分页);
}

希望这能有所帮助。

Spring Data JPa有很多非常有效的功能,但它不是万能的。您必须创建一个唯一的查询。。。或者是一个规范,因为你可以将它与Pageable一起使用。那么Pageable对象排序字段是什么样的呢?如果只有6个人,其中3个人有2个地址,其余的人每人有一个地址,那么如果我们使用这个countQuery,我会得到9个人的记录,对吗?其中有三个duplicate@PhilipJohni我对它进行了实验,并改变了我提出的解决方案,请检查我在另一篇stackoverflow文章中看到过这个解决方案,我想知道是否有其他方法。也许你也可以添加原始答案的链接,作为你答案的参考。@PhilipJohn参考
@Repository
public interface PersonRepository extends JpaRepository <Person, Long> {

    @Query(
        value = "select p from Person p join p.addresses ad group by p Order By addressCount asc",
        countQuery = "select count(p) from Person p"
    )
    Page<Person> findAllOrderByAddressCountAsc(Pageable pageable);

    @Query(
        value = "select p from Person p join p.addresses ad group by p Order By addressCount desc",
        countQuery = "select count(p) from Person p"
    )
    Page<Person> findAllOrderByAddressCountDesc(Pageable pageable);
}