繁体   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