Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java QueryDsl-关联实体的多个字段上的JPA查询 几个简单的实体:_Java_Spring_Hibernate_Jpa_Querydsl - Fatal编程技术网

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());