2016-07-15 18 views
1

Ich brauche diese Abfrage in JPA CriteriaBuilder Code zu replizieren:JPA CriteriaBuilder Verbindung Kriterien in eine Disjunktion Kriterien

.... 
where 
    article.client_id = 1 
    and article.price > 0 
    and (
      article.code like '%this is statement%' 
      or article.oem_code like '%this is statement%' 
      or ( 
       article.description like '%this%' 
       and article.description like '%is%' 
       and article.description like '%statement%' 
      )  
    ) 

und hier ist mein Code:

... 

Root<Article> article = cq.from(Article.class); 

List<Predicate> predicates = new ArrayList<Predicate>(); 

predicates.add(cb.equal(article.get(Article_.clientId), filter.getClientId())); 

predicates.add(cb.greaterThan(article.get(Article_.price), BigDecimal.ZERO)); 

String searchQuery = filter.getSearchQuery(); 

Predicate disjunction = cb.disjunction(); 

disjunction.getExpressions().add(cb.like(article.get(Article_.code), "%" + searchQuery + "%")); 
disjunction.getExpressions().add(cb.like(article.get(Article_.oem_code), "%" + searchQuery + "%")); 

List<Predicate> andPredicate = new ArrayList<Predicate>(); 

for (String str : searchQuery.split(" ")) { 
    andPredicate.add(cb.like(article.get(Article_.description), "%" + str + "%"));  
} 

Nun, wie kann ich diese hinzufügen andPredicate zu meinem Disjunktion Prädikat? getExpressions().add(...) benötigt keinen Predicate als param.

Dank

Antwort

1

Also hier ist es, was ich tat und scheint, dass funktioniert gut:

... 
Predicate pr1 = cb.like(article.get(Article_.code), "%" + searchQuery + "%"); 
Predicate pr2 = cb.like(article.get(Article_.oem_code), "%" + searchQuery + "%"); 
Predicate pr3 = cb.conjunction(); 

for (String str : busquedaSplit) { 
    Predicate newPredicate = cb.like(article.get(Article_.description), "%" + str + "%"); 
    pr3 = cb.and(pr3, newPredicate); 
} 

disjunction = cb.or(pr1, pr2, pr3); 

predicates.add(disjunction); 
+0

Mann, du hast mir sehr geholfen ... mit diesem Ansatz können wir Operatoren AND und OR mischen. .. wie hast du die return statement geschrieben? thanx – Hinotori

+0

@Hinotori Ich habe es in einem Array wie diesem 'Prädikaten.toArray (neues Prädikat [Prädikat.Grund()]) konvertiert und das ist, was Sie in Ihre 'cq.where (' ... ') setzen müssen ; ' –