Java QueryDsl-关联实体的多个字段上的JPA查询 几个简单的实体:
技术堆栈Java QueryDsl-关联实体的多个字段上的JPA查询 几个简单的实体:,java,spring,hibernate,jpa,querydsl,Java,Spring,Hibernate,Jpa,Querydsl,技术堆栈 冬眠5.2.10 QueryDsl(jpa,apt)4.1.4 弹簧靴1.5.6 Spring数据JPA(因此,使用存储库) 存储库扩展QueryDslPredicateExecutor 我想做一个这样的查询: 选择关联的会议,其中以下两项对于会议活动均为真: *MeetupCampaign.id=x *MeetupCampaign.approvalStatus=y 重要的是,两者都必须是真实的 我能够得到其中一个条件为真的结果,但不能同时筛选这两个条件 我正在将谓词传递到存储库.
- 冬眠5.2.10
- QueryDsl(jpa,apt)4.1.4
- 弹簧靴1.5.6
- Spring数据JPA(因此,使用存储库)
- 存储库扩展
QueryDslPredicateExecutor
*MeetupCampaign.id=x
*MeetupCampaign.approvalStatus=y 重要的是,两者都必须是真实的 我能够得到其中一个条件为真的结果,但不能同时筛选这两个条件 我正在将谓词传递到
存储库.findAll()
我不确定是使用MeetupRepository
还是使用MeetupCampaignRepository
当获取只是会议活动时,此谓词起作用:
但是当我尝试获取会议时,间接寻址失败:
在本例中,我得到任何一个条件为true的MeetupCampaign
考虑这个数据集:
请注意,应选择Meetup 500和504。
501是这里最重要的一个。不应选择它,因为与之关联的两个MeetupCampaign都不符合其中一个条件
你能帮我写这个查询吗?
更新
实体的(简化)代码:
@实体
公开课集会{
@身份证
@列(nullable=false,Updateable=false)
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
@Fetch(FetchMode.SELECT)
@RestResource(导出=假)
@OneToMany(mappedBy=“meetup”,fetch=FetchType.EAGER,orphanRemoving=true)
私有集meetupCampaigns=新HashSet();
}
@实体
公开课集会运动{
@身份证
@列(nullable=false,Updateable=false)
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(nullable=false,updateable=false)
私人竞选活动;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(nullable=false,updateable=false)
私人聚会;
@枚举(EnumType.STRING)
私人批准状态批准状态;
}
@实体
公课运动{
@身份证
@列(nullable=false,Updateable=false)
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
}
在这里找到了答案:
您可以使用子查询表达式查找具有这两个属性的所有meetupCampaigns
,然后使用SimpleExpression.in()
查找与这些meetupCampaigns
相关的meetups
前
您能为MeetupCampaign
实体发布代码吗?至少与Meetup
和Campaign
的关联。此外,您希望仅为MeetupCampaign
或也为带有join的Meetup
选择数据?@lzagkareto因为查询应该只返回Meetups
。我不确定这是否回答了你的问题。。。另外,添加了代码。测试通过。w00t
meetupCampaign.approvalStatus.eq(approvalStatus).and(meetupCampaign.campaign.id.eq(campaignId));
meetup.meetupCampaigns.any().campaign.id.eq(campaignId).and(meetup.meetupCampaigns.any().approvalStatus.eq(approvalStatus));
<!-- 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"/>
@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;
}
meetup.in(JPAExpressions.select(meetupCampaign.meetup).from(meetupCampaign).where(meetupCampaign.campaign.id.eq(campaignId).and(meetupCampaign.approvalStatus.eq(status))).fetchAll());