QueryDslPredicateExecutor
为MeetupCampaigns选择以下 BOTH 的关联Meetup:
* MeetupCampaign.id = x
* MeetupCampaign.approvalStatus = y
我能够获得 条件为真,但无法过滤两者的结果
repository.findAll()
我不确定是使用MeetupRepository
还是MeetupCampaignRepository
MeetupCampaigns
时,此谓词有效:meetupCampaign.approvalStatus.eq(approvalStatus).and(meetupCampaign.campaign.id.eq(campaignId));
Meetups
:meetup.meetupCampaigns.any().campaign.id.eq(campaignId).and(meetup.meetupCampaigns.any().approvalStatus.eq(approvalStatus));
在这种情况下,我得到任何 条件为真的MeetupCampaign
。
<!-- Should be selected -->
<meetup_campaign id="600" meetup_id="500" campaign_id="200" approval_status="ACCEPTED"/>
<meetup_campaign id="605" meetup_id="504" campaign_id="200" approval_status="ACCEPTED"/>
<!-- Rejected because meetupCampaign status declined -->
<meetup_campaign id="601" meetup_id="501" campaign_id="200" approval_status="DECLINED"/>
<!-- Rejected because wrong campaign id -->
<meetup_campaign id="602" meetup_id="500" campaign_id="201" approval_status="ACCEPTED"/>
<meetup_campaign id="606" meetup_id="501" campaign_id="201" approval_status="ACCEPTED"/>
<meetup_campaign id="603" meetup_id="502" campaign_id="201" approval_status="ACCEPTED"/>
<!-- Rejected on both counts -->
<meetup_campaign id="604" meetup_id="503" campaign_id="201" approval_status="DECLINED"/>
请注意,应选择聚会500和504。 501是这里的重要人物。不应该选择它,因为与它关联的两个MeetupCampaigns都不符合其中一个标准。
@Entity
public class Meetup {
@Id
@Column(nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
@Fetch(FetchMode.SELECT)
@RestResource(exported = false)
@OneToMany(mappedBy = "meetup", fetch = FetchType.EAGER, orphanRemoval = true)
private Set<MeetupCampaign> meetupCampaigns = new HashSet<>();
}
@Entity
public class MeetupCampaign {
@Id
@Column(nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(nullable = false, updatable = false)
private Campaign campaign;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(nullable = false, updatable = false)
private Meetup meetup;
@Enumerated(EnumType.STRING)
private ApprovalStatus approvalStatus;
}
@Entity
public class Campaign {
@Id
@Column(nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
}
答案 0 :(得分:1)
Found an answer here: QueryDsl - subquery in collection expression
You can use a subquery expression to find all the meetupCampaigns
with those two properties and then use the SimpleExpression.in()
to find meetups
related to those meetupCampaigns
.
ex.
meetup.in(JPAExpressions.select(meetupCampaign.meetup).from(meetupCampaign).where(meetupCampaign.campaign.id.eq(campaignId).and(meetupCampaign.approvalStatus.eq(status))).fetchAll());