Bonjour,

Depuis que l'API Criteria a été incluse dans JPA2, j'ai toujours voulu l'utiliser pour construire mes requêtes dynamiques au lieu de jouer avec une String représentant la requête JPQL.

J'aimerais commencer par faire une requête toute simple.

Voici le prototype de ma fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
public List<User> findUser(String nom, String prenom, String login);
Comme vous l'avez surement compris, j'essaie de faire une requete sur des utilisateurs en fonction de la présence ou nom de paramètres d'entrée.

exemple: Si j'ai login.equals("") alors je fait une clause WHERE uniquement sur nom et prenom.

Voici ce que j'ai essayé de faire pour le moment:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
public List<User> findUser(String nom, String prenom, String login) {
		login = (login==null?"":login.trim());
		nom = (nom==null?"":nom.trim());
		prenom = (prenom==null?"":prenom.trim());
		List<User> result = null;
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<User> cquery = cb.createQuery(User.class);
		Root<User> root = cquery.from(User.class);
		cquery = cquery.select(root);
 
		Predicate whereP;
                //initialisation du where par un predicate toujours vrai afin de faire des AND dynamiquement à la suite
 
		if(!login.isEmpty()) {
		   //ajout d'une clause AND: cb.equal(root.get("nom"), nom))
                }
		if(!nom.isEmpty()) {
		  //idem pour le nom
                }
		if(!prenom.isEmpty()) {
                  //idem pour le prenom
		}
 
		cquery.orderBy(cb.asc(root.get("nom")), cb.asc(root.get("prenom")));
		result = em.createQuery(cquery).getResultList();
		return result;
	}
J'imagine qu'il y a une astuce mais laquelle?

Merci!