Java Spring数据jpa按嵌套对象集合大小排序
我使用的是spring启动应用程序,存在以下两个实体 Person.javaJava 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
@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);
}