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。这将为您提供一个至少有一个从>日期开始生效的合同的建筑
恐怕这就是问题所在-我明确希望建筑
也没有返回匹配的合同。而不是使用或添加更多条件,这将为您提供一个至少有一个合同的建筑从>日期开始生效的合同
恐怕这就是问题所在-我明确希望建筑物
也没有返回匹配的合同。而不是使用或添加更多条件