Bonjour,

Actuellement j'utilise JPA avec des TypedQuery ou des NamedQuery comme ceci :
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
public Mandat getMandat(SocieteLieuDomaineComp sldc,
			TypeAbscenceCi typeAbsenceCi, LocalDate dateValidite) {
		try {
			StrBuilder requete = new StrBuilder();
			requete.append("SELECT mandat FROM Mandat mandat WHERE mandat.societeLieuDomaineComp = :sldc");
			requete.append(" AND mandat.typeAbsenceCi = :typeAbsenceCi");
			requete.append(" AND mandat.dateDebut <= :date AND mandat.dateFin >= :date");
 
			TypedQuery<Mandat> query = m_em.createQuery(requete.toString(), Mandat.class);
			query.setParameter("sldc", sldc);
			query.setParameter("typeAbsenceCi", typeAbsenceCi);
			query.setParameter("date", dateValidite.toDate());
 
			return query.getSingleResult();
		} catch (NoResultException e) {
			System.out.println(e);
			return null;
		} catch (Throwable e) {
			throw new MyEjbException(e);
		}
	}
Appelée comme ceci depuis ma mon ManagedBean:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
Mandat mandat = m_mandatService.getMandat(sldc, typeAbscenceCi, curDate);

Le problème est qu'à chaque fois que je veux faire une requête avec des paramètres différents, je dois soit créer une nouvelle méthode soit ajouter des paramètres qui seront null dans bien des cas.

J'aimerais donc utiliser des CriteriaQuery mais je ne vois pas trop comment m'y prendre car pour définir une CriteriaQuery, il faut un entitymanager.
Idéalement, il faudrait pouvoir appeler une méthode de service depuis une classe métier (qui ne connait pas d'entityManager) avec comme seul paramètre le criterion déjà construis avec les x paramètres que l'on veut, un peu comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
// Construction du criterion en fonction des paramètres que l'on veut filtrer
// monCriterion = .....
Mandat mandat = m_mandatService.getMandat(monCriterion);
Et dans le DAO l'execution de la requete

Est-ce possible de faire ça ? Si oui comment ?

Merci pour votre aide