faire un createCriteria sous condition
Bonjour les gens,
bon ça fait 2 heures que je cherche et je n'arrive pas à trouver la solution donc je sollicite l'aide d'une bonne âme charitable.
J'ai 2 objets mappés :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| public class ObjetPapa implements java.io.Serializable {
...
private ObjetFils objetFils;
...
}
public class ObjetFils implements java.io.Serializable {
...
private long id;
private String param;
...
} |
Côté base de données, j'ai ma table représentant ObjetPapa remplie comme ceci :
Code:
1 2 3 4 5 6 7 8
| idObjetPapa idObjetFils
1 5
2 8
3 0
4 15
5 0
6 17
etc... |
Pré-requis :
les enregistrement en base, qui viennent d'une autre application, auraient du être renseignées avec la valeur null dans idObjetFils si jamais ObjetPapa n'avait pas d'ObjetFils, mais ce n'est pas le cas. Au lieu de ça, ils sont enregistrés avec idObjetFils=0. C'est comme ça, c'est moche mais je ne peut rien y faire.
Donc mon soucis est le suivant :
Je veux faire une requête qui récupère
- tous les ObjetPapa qui ont un ObjetFils tel que param="toto"
ET - tous les ObjetPapa qui n'ont pas d'ObjetFils (idObjetFils=0)
j'arrive à faire les deux requêtes distinctes qui sont respectivement
Code:
1 2 3
| Criteria criteria = sessionFactory.getCurrentSession()
.createCriteria(ObjetPapa.class);
criteria.add(Restrictions.eq("objetFils.id", 0); |
et
Code:
1 2 3 4
| Criteria criteria = sessionFactory.getCurrentSession()
.createCriteria(ObjetPapa.class);
Criteria criteriaFils = criteria.createCriteria("objetFils");
criteriaFils.add(Restrictions.eq("param","toto")); |
Cependant, je n'arrive pas à obtenir une unique requête qui me retourne tous les enregistrements à la fois.
Est-ce qu'il existe une façon de faire quelque chose comme :
Code:
1 2 3 4 5 6
| Criteria criteria = sessionFactory.getCurrentSession()
.createCriteria(ObjetPapa.class);
Criterion critZero = Restrictions.eq("objetFils.id", 0);
Criteria criteriaFils = criteria.createCriteria("objetFils");
criteriaFils.add(Restrictions.eq("param","toto"));
criteria.add(Restrictions.or(critZero,criteriaFils)); |
Merci d'avance