2016-07-23 217 views
4

我有一個簡單的實體一對多的關係QueryDSL謂詞SetPath.any與多個條件

@Entity // and other @ stuff 
public class Member { 
    @Id 
    private Long id; 
    private String name; 
    private List<Program> 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 。

回答

7

得到一些幫助在這裏: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); 
+0

真棒,這真的幫了我工作啓動 –