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:
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:
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!
Partager