2016-07-23 2 views
4

j'ai une entité simple relation un à plusieursQueryDSL prédicats SetPath.any avec de multiples conditions

@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; 
    ... 
} 

Maintenant, en utilisant QueryDSL, je voudrais interroger « Tous les membres inscrits à un programme avec programType = « FULLTIME »et programCost> $ 1000'

J'ai utilisé le prédicat suivant

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

avec JPARepository

memberRepository.findAll(predicate); 

Maintenant, le problème est que les deux requêtes sont indépendantes. Il renvoie tous les membres avec au moins un programme de type 'FULLTIME' ou au moins un programme de coût supérieur à 1000.

Résultat souhaité: Renvoie les membres s'il a au moins un programme de type FULLTIME et coût> 1000 .

Répondre

7

aide ici Got: https://groups.google.com/forum/#!topic/querydsl/hxdejLyqXos

Fondamentalement, les conditions du programme doivent être dans un sous-requête séparée (une instance 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

impressionnant, il a vraiment aidé à la mise en service que je travaille pour –