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