Java Spring数据JPA-单独过滤@OneToMany关系

Java Spring数据JPA-单独过滤@OneToMany关系,java,spring-data-jpa,Java,Spring Data Jpa,假设如下: public class Building { @Column(nullable = false) private String zipCode; @OneToMany(mappedBy = "building", fetch = FetchType.LAZY) private final Set<Contract> contracts = new HashSet<>(); } public class Cont

假设如下:

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;
}
公共类建筑{
@列(nullable=false)
私有字符串zipCode;
@OneToMany(mappedBy=“building”,fetch=FetchType.LAZY)
私有最终集契约=新HashSet();
}
公共类合同{
@ManyToOne(可选=false,fetch=FetchType.EAGER)
@JoinColumn(nullable=false,updateable=false)
私人楼宇;;
@列(nullable=false)
私有LocalDate-activeFrom;
}
最好使用spring数据jpa存储库,我如何选择所有具有某个
zipCode
的建筑,然后对于每个建筑,使用早于X的
activeFrom
的所有合同

我在互联网上找到的所有解决方案似乎都专注于过滤主要对象(
建筑
),而我希望对子对象(
合同
)使用不同的动态标准,如果没有找到,则接收空列表我明确希望接收没有匹配合同的建筑物。


如果使用的是DTO/投影而不是实体类,这很好。

我假设您正在寻找一个可以使用的JpaRepository查询。可以使用“\ux”将查询应用于嵌入对象上的字段


例如,findAllByBuilding_zipCode and ActiviefRomBefore…

我假设您正在寻找一个可以使用的JPA正向查询。可以使用“\ux”将查询应用于嵌入对象上的字段


例如,findAllByBuilding_zipCode和ActiviefRomBefore…

您可以使用类似这样的内容按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);

只需确保在筛选之前加入了第二个表即可

您可以使用类似的方法通过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);

只需确保您在筛选之前加入了第二个表

这将筛选出没有在X之前激活的
合同的
建筑
s。我明确希望它们在合同中返回一个空列表。好的,很抱歉,我没有从问题中找到明确的答案。我将其理解为合同是您希望返回的主要实体,因此如果没有找到任何内容,则将为空。同样,不确定如何以方法格式完成此操作,但是使用@Query和Join fetches可能是值得的。这将过滤掉没有在X之前激活的
契约的
构建
s。我明确希望它们在契约中返回一个空列表。好的,很抱歉,我没有从问题中找到明确的答案。我将其理解为合同是您希望返回的主要实体,因此如果没有找到任何内容,则将为空。同样,不确定如何以方法格式完成此操作,但可能值得使用@Query with Join fetches。
这将为您提供一个至少有一个从>日期开始生效的合同的建筑
恐怕这就是问题所在-我明确希望
建筑
也没有返回匹配的合同。而不是使用或
添加更多条件,这将为您提供一个至少有一个合同的建筑从>日期开始生效的合同
恐怕这就是问题所在-我明确希望
建筑物
也没有返回匹配的合同。而不是使用或添加更多条件