如何在 Querydsl for Spring Data JPA 中找到那些至少有一个 child 满足多个条件的实体?
How in Querydsl for Spring Data JPA do I find those entitities that have at least one child satisfying several conditions?
我的模型中有以下关系:
我正在尝试使用 Spring Data JPA 中的 Querydsl 功能来查找相关学生在给定日期范围内在给定住宅中有租约的所有约定。我尝试了以下 return 适当的 BooleanExpression
可以与其他人结合并提供给 EngagementRepository.findAll()
:
public BooleanExpression inResidence(Residence residence, LocalDate startDate, LocalDate endDate) {
final QTenancy tenancies = QEngagement.engagement.student.tenancies.any();
return tenancies.residence.eq(residence)
.and(tenancies.startDate.loe(endDate))
.and(tenancies.endDate.goe(startDate));
}
然而,结果 SQL 包含针对三个条件中的每一个的独立 EXISTS 子查询——居住地、开始日期和结束日期;也就是说,就目前而言,当我所追求的是满足所有三个条件的合格租赁时,不同的租赁可以满足每个条件。我意识到我可能误解了 any()
的目的并怀疑我需要使用 Querydsl 的子查询,但我不太确定如何使用,特别是因为我发现的一些示例是针对版本 3 的,而且看起来已在版本 4 中更改。
这是我设法在 Querydsl 4 中使用子查询的结果。生成的 SQL 只有一个 EXISTS 子查询来测试所有三个条件。
public BooleanExpression inResidence(Residence residence, LocalDate startDate, LocalDate endDate) {
final QTenancy tenancy = QTenancy.tenancy;
return QEngagement.engagement.student.tenancies.any().in(
JPAExpressions.selectFrom(tenancy).where(
tenancy.residence.eq(residence)
.and(tenancy.startDate.loe(endDate))
.and(tenancy.endDate.goe(startDate))
)
);
}
我的模型中有以下关系:
我正在尝试使用 Spring Data JPA 中的 Querydsl 功能来查找相关学生在给定日期范围内在给定住宅中有租约的所有约定。我尝试了以下 return 适当的 BooleanExpression
可以与其他人结合并提供给 EngagementRepository.findAll()
:
public BooleanExpression inResidence(Residence residence, LocalDate startDate, LocalDate endDate) {
final QTenancy tenancies = QEngagement.engagement.student.tenancies.any();
return tenancies.residence.eq(residence)
.and(tenancies.startDate.loe(endDate))
.and(tenancies.endDate.goe(startDate));
}
然而,结果 SQL 包含针对三个条件中的每一个的独立 EXISTS 子查询——居住地、开始日期和结束日期;也就是说,就目前而言,当我所追求的是满足所有三个条件的合格租赁时,不同的租赁可以满足每个条件。我意识到我可能误解了 any()
的目的并怀疑我需要使用 Querydsl 的子查询,但我不太确定如何使用,特别是因为我发现的一些示例是针对版本 3 的,而且看起来已在版本 4 中更改。
这是我设法在 Querydsl 4 中使用子查询的结果。生成的 SQL 只有一个 EXISTS 子查询来测试所有三个条件。
public BooleanExpression inResidence(Residence residence, LocalDate startDate, LocalDate endDate) {
final QTenancy tenancy = QTenancy.tenancy;
return QEngagement.engagement.student.tenancies.any().in(
JPAExpressions.selectFrom(tenancy).where(
tenancy.residence.eq(residence)
.and(tenancy.startDate.loe(endDate))
.and(tenancy.endDate.goe(startDate))
)
);
}