簡體   English   中英

Spring Data JPA - 分別過濾@OneToMany 關系

[英]Spring Data JPA - filtering @OneToMany relation separately

假設如下:

public class Building {
   @Column(nullable = false)
   private String zipCode;

   @OneToMany(mappedBy = "building", fetch = FetchType.LAZY)
   private final Set<Contract> contracts = new HashSet<>();
}

public class Contract {
   @ManyToOne(optional = false, fetch = FetchType.EAGER)
   @JoinColumn(nullable = false, updatable = false)
   private Building building;


   @Column(nullable = false)
   private LocalDate activeFrom;
}

最好使用 spring-data-jpa 存儲庫,如何選擇具有特定zipCode所有建築物,然后為每個建築物選擇所有具有早於 X 的activeFrom合同?

我可以在互聯網上找到的所有解決方案似乎都專注於過濾主要對象( Building ),而我想為子對象( Contract )使用不同的動態標准,如果沒有找到,則會收到一個空列表。 我明確希望收到沒有匹配合同的建築物。

如果使用 DTO/投影而不是實體類,那很好。

我假設您正在尋找可以使用的 JpaRepository 查詢。 您可以使用“_”將查詢應用於嵌入對象上的字段。

例如,findAllByBuilding_ZipCodeAndActiveFromBefore...

你可以使用這樣的東西來過濾 zipCode 和 activeFrom

String FIND_ALL_BUILDINGS_BY_ZIP_CODE_AND_ACTIVE_FORM = "SELECT b FROM Building b" +
        " inner join b.contract as c " +
        " with c.activeFrom > :date " +
        " where b.zipCode = :zipCode";

@Query(FIND_ALL_BUILDINGS_BY_ZIP_CODE_AND_ACTIVE_FORM)
List<Group> findAllBuildingsByZipCodeAndActiveFrom(@Param("zipCode") String zipCode, @Param("date") LocalDate date);

這將為您提供一個至少有一個 activeFrom > date 合同的建築

您也可以嘗試使用此查詢:

String FIND_ALL_BUILDINGS_BY_ZIP_CODE_AND_ACTIVE_FORM = "SELECT b FROM Building b" +
        " inner join b.contract as c " +
        " where c.activeFrom > :date " +
        " and b.zipCode = :zipCode";

只要確保您在過濾之前加入了第二個表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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