4

Je suis confronté à un problème de requête de critères JPA. Comment puis-je ajouter plusieurs clause where dans mes critères de requête avec si d'autre ...Clause conditionnelle Where dans la requête de critères JPA

Mon exigence est:

CriteriaBuilder builder = getEm().getCriteriaBuilder(); 
CriteriaQuery<Object> query = builder.createQuery(Object.class); 

// From 
Root<EntityClass> entity= query.from(EntityClass.class); 
// Select 
query.multiselect(entity.get("id").get("col1"),entity.get("id").get("col2")); 
// Where 
Predicate p1 = builder.and(builder.equal(entity.get("col3"), value3)); 
Predicate p2 = builder.and(builder.equal(entity.get("col4"), value4)); 
Predicate p3 = builder.and(builder.equal(entity.get("col5"), value5)); 
if(someCondition1){ 
    query.where(p1); 
}else if(someCondition2){ 
    query.where(p1); 
} 
query.where(p3); 

Dans le code ci-dessus la déclaration query.where (p3); remplace la condition de clause where définie précédemment p1 et p2. Ce que l'autre, j'ai trouvé est en conjonction avec comme ci-dessous

if(someCondition1){ 
    query.where(p1, p3); 
}else if(someCondition2){ 
    query.where(p2, p3); 
}else{ 
    query.where(p3); 
} 

Mais ce n'est pas une bonne approche, parce que quand il y a beaucoup de si-else cela devient très mal à écrire des codes de répétition. Quelqu'un peut-il avoir une solution pour cela?

Répondre

6

Quelque chose comme ceci:

Predicate p; 
Predicate p3 = builder.equal(entity.get("col5"), value5); 
if(someCondition1){ 
    p = builder.equal(entity.get("col3"), value3); 
}else if(someCondition2){ 
    p = builder.equal(entity.get("col4"), value4); 
} 
if (p != null) p = builder.and(p, p3); 
else p = p3; 
query.where(p); 

Alors n'appellent où dans tous les cas construire juste une expression complète et appeler où une fois à la fin.

+0

Bonne approche merci! – Furkan

13

Vous pouvez créer un tableau prédicats pour stocker vos prédicats conditionnels puis l'ajouter à la clause where:

List<Predicate> predList = new LinkedList<Predicate>(); 
if(someCondition1){ 
    predList.add(p1); 
}else if(someCondition2){ 
    predList.add(p2); 
} 
predList.add(p3); 
Predicate[] predArray = new Predicate[predList.size()]; 
predList.toArray(predArray); 
query.where(predArray); 

Cela permet d'ajouter dynamiquement tout type de prédicat.

+0

Mais il y aura encore des tonnes de si/sinon –

Questions connexes