[英]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.