具有多个条件的QueryDSL Predicate SetPath.any

我有一个简单的实体,有一对多的关系

@Entity // and other @ stuff public class Member { @Id private Long id; private String name; private List programs; ... } @Entity public class Program { @Id private Long id; private Long programName; private ProgramType programType; private Long programCost; ... } 

现在使用QueryDSL,我想查询’所有成员注册的程序,其中programType =“FULLTIME”和programCost> $ 1000′

我使用了以下谓词

 Predicate predicate = QMember.member.programs.any() .programType.eq(ProgramType.FULLTIME) .and(QMember.member.programs.any().programCost.gt(1000)); 

使用JPARepository

 memberRepository.findAll(predicate); 

现在的问题是这两个查询是独立的。 它返回al成员至少有一个类型为’FULLTIME’的程序或至少一个成本大于1000的程序。

期望的结果:如果他至少有一个类型为FULLTIME并且成本> 1000的程序,则返回成员。

在这里得到一些帮助: https : //groups.google.com/forum/#!topic / querydsl / hxdejLyqXos

基本上程序的条件需要在一个单独的子查询中( JPASubquery实例)

 QProgram program = QProgram.program JPASubQuery subQuery = new JPASubQuery(); subQuery.from(program) .where(program.programType.eq(ProgramType.FULLTIME), program.programCost.gt(1000)); Predicate predicate = QMember.member.name.eq("John") .and(subQuery.exists()); memberRepository.findAll(predicate); 

正如@Shahbour所提到的,这不再适用于QueryDsl 4.x +。

我有类似的情况(除了我的实体是双向的),我用这个解决了它:

 QProgram program = QProgram.program; QProgram member = QProgram.member; Predicate predicate = JPAExpressions .selectOne() .from(program) .where(program.member.id.eq(member.id), program.programCost.gt(1000), program.programType.eq(ProgramType.FULLTIME)) ) .exists(); memberRepository.findAll(predicate);