Bonjour,

J'ai un soucis pour écrire une requête avec les objects criteria.

Mon modèle définit des personnes (Person), des affiliations (Affiliate) et des tâches (UpdateRequest). Une tâche peut être assignée à une personne ou à une affiliation.

Ce que je tente d'obtenir, c'est la liste des tâches à faire étant donné le nom d'une personne, que la tâche soit liée à son affiliation ou a sa personne.

Le code SQL que je désire obtenir est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
select this_.*, person1_.*, affiliate2_.*, person3_.* 
from UpdateRequest this_ 
left outer join Person person1_ on this_.personId=person1_.id 
left outer join Affiliate affiliate2_ on this_.AffiliateId=affiliate2_.id 
left outer join Person person3_ on affiliate2_.personId=person3_.id 
where (lower(person1_.name) like 'dupont') or (lower(person3_.name) like 'dupont')
Voici le code java que j'ai tenté:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
Criteria criteria = getSession().createCriteria(UpdateRequest.class);
Criteria subscriberCriteria = criteria.createCriteria("person", CriteriaSpecification.LEFT_JOIN);
Criteria affiliateCriteria = criteria.createCriteria("affiliate", CriteriaSpecification.LEFT_JOIN);
Criteria personCriteria = affiliateCriteria.createCriteria("person", CriteriaSpecification.LEFT_JOIN);
subscriberCriteria.add(Restrictions.ilike("name", searchValue, MatchMode.ANYWHERE));
personCriteria.add(Restrictions.ilike("name", searchValue, MatchMode.ANYWHERE));
Le soucis, c'est que ce code me génère le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
select this_.*, person1_.*, affiliate2_.*, person3_.* 
from UpdateRequest this_ 
left outer join Person person1_ on this_.personId=person1_.id 
left outer join Affiliate affiliate2_ on this_.AffiliateId=affiliate2_.id 
left outer join Person person3_ on affiliate2_.personId=person3_.id 
where (lower(person1_.name) like 'dupont') and (lower(person3_.name) like 'dupont')
Faire des restrictions sur deux subqueries se tranduit par un AND, mais moi je voudrais un OR.

Comment faire?