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 :
Voici le code java que j'ai tenté:
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')
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
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));
Faire des restrictions sur deux subqueries se tranduit par un AND, mais moi je voudrais un OR.
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')
Comment faire?
Partager