![](/img/trans.png)
[英]Sort entity and its nested collection @OneToMany Spring Data JPA with Pageable
[英]Spring data jpa sort by nested object collection size
我正在使用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;
}
Address.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);
其中pageable
是org.springframework.data.domain.Pageable
的实例。
我可以使用Person
的其他列进行排序。 但是我想基于地址集合,基于每个Person
实体的Address
记录数进行排序。
简而言之,我想根据Collection的集合大小对 Persons进行排序。 排序顺序(ASC或DESC)来自前端。
知道Pageable
对象应如何实现吗? 如果一个Person
存在多个Address
则也不会返回任何重复的Person
记录。
这是使用Spring Data JpaRepository根据按订单排序的解决方案。
在我的实验中,我尝试如下定义存储库,但是这样做有问题。 当我们在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模式:
@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);
}
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.