gpt4 book ai didi

java - Spring data jpa 按嵌套对象集合大小排序

转载 作者:行者123 更新时间:2023-11-30 06:43:15 25 4
gpt4 key购买 nike

我正在使用 spring boot 应用程序并且存在以下 2 个实体。

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;
}

地址.java

@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;
}

我正在使用一个 JpaRepository 如下。

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

然后我使用下面的语句来实现分页和排序。

Page<Person> allPersons = personRepository.findAll(pageable);

其中 pageableorg.springframework.data.domain.Pageable 的实例。

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

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

知道 Pageable 对象应该如何实现这个吗?如果 Person 存在多个 Address,也不返回任何重复的 Person 记录。

最佳答案

这是根据 Order by count using Spring Data JpaRepository 的解决方案.

在我的实验中,我尝试按如下方式定义 Repository,但这样做有问题;因为我们在 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);
}

因此,作为一种解决方法,我尝试将排序逻辑转移到查询定义本身中,最终我得到了 ASC 和 DESC 模式的 2 个版本:

@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);
}

希望这对您有所帮助。

关于java - Spring data jpa 按嵌套对象集合大小排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52310031/

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