簡體   English   中英

Spring Data JPA按嵌套對象集合大小排序

[英]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);

其中pageableorg.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM