2010-05-21 2 views
7

Cette question est très similaire à this one mais les réponses étaient minimes à cette question.Requête de critères Hibernate à faire correspondre à tous les éléments de collection enfants

J'ai une classe parent avec un ensemble d'entités enfants. Les entités enfant sont simplement un wrapper pour une chaîne et vivent dans une table différente de l'entité parente. Je souhaite avoir une requête de critères renvoyant les entités parentes lorsque tous les membres de l'ensemble des entités enfants retournent true à une condition. Cette condition correspond à l'une des listes de chaînes. Voici où je suis:

Criteria c = criteria(); 
Criteria ands = c.createCriteria("ands"); 
Disjunction dis = Restrictions.disjunction(); 
for (String value : values) { 
    dis.add(Restrictions.like("value", "%" + value + "%")); 
} 
ands.add(dis); 
return list(c); 

« est » l'ANDS ensemble d'entités avec un champ « valeur » qui est une chaîne. "criteria()" crée un critère pour la classe parente. "list()" appelle juste criteria.list();

Ceci correspond juste à l'un des éléments plutôt qu'à tous.

Hope this sens. Toute aide très appréciée.

Répondre

0

Cette disjonction ne devrait-elle pas être une conjonction?

+0

Salut, Il doit être une disjonction parce que je veux choisir le parent où chaque élément de la collection est comme soit chaîne a, ou chaîne b, ou chaîne c. etc. –

3

Comme un exercice théorique, vous pouvez faire quelque chose comme ceci:

Criterion condition = ...; 

Criteria c = s.createCriteria(Parent.class, "p"); 
DetachedCriteria dc = DetachedCriteria.forClass(Parent.class, "p2") 
    .createCriteria("ands", "c") 
    .add(Restrictions.not(condition)) 
    .add(Property.forName("p.id").eqProperty("p2.id")) 
    .setProjection(Projections.id()); 

c.add(Subqueries.notExists(dc)); 

Cependant, cette approche n'est pas bon pour une utilisation pratique car il nécessite de plus join (en raison de l'absence de in elements clause dans l'API Criteria). Notez également qu'il utilise la double négation (SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <condition>)), donc il peut avoir des problèmes avec NULL s.

EDIT: En HQL il peut être écrit comme ceci:

from Parent p 
where not exists (select c from p.ands c where not <condition>) 

ou

from Parent p 
where not exists (select c from Child c 
    where not <condition> and c in elements(p.ands)) 

Mais, pour autant que je comprends, les deux questions ne peuvent pas être exprimés dans l'API Critères (vous ne pouvez pas écrire from p.ands dans la sous-requête et vous ne pouvez pas utiliser in elements). Ainsi, dans l'API critères que vous devez utiliser joindre supplémentaires (note 2 Parent s):

from Parent p 
where not exists (select c from Parent p2 join p2.ands c 
    where not <condition> and p = p2) 
+0

merci pour cela. Juste explorer ses possibilités. Peut-être que HQL serait mieux ici, mais j'ai de la difficulté à comprendre la clause elements(). Puis-je utiliser tous les éléments (parent.ands) d'une manière ou d'une autre? –

+0

@Andrew: Édité – axtavt

+0

ah - cool. Cela fonctionne comme prévu. Merci beaucoup. Juste préoccupé par la performance maintenant. –

Questions connexes