2010-05-21 3 views
7

Этот вопрос очень похож на this one, но ответы были минимальными для этого вопроса.Запрос на спящий режим для соответствия всем элементам детской коллекции

У меня есть родительский класс с набором дочерних объектов. Дочерние объекты - это всего лишь оболочка для строки и живут в другой таблице родительскому объекту. Я хочу иметь запрос критериев, который возвращает родительские объекты, когда все члены набора дочерних объектов возвращают true в состояние. Это условие соответствует одному из списка строк. Вот где я:

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); 

«ANDS» является набор объектов с полем «значение», то есть строка. «критерии()» создает критерии для родительского класса. «list()» просто вызывает критерии.list();

Это просто соответствует любому из элементов, а не всем.

Надеюсь, что это имеет смысл. Любая помощь очень ценится.

ответ

0

Не должно ли это дизъюнкция быть конъюнкцией?

+0

Привет, Она должна быть дизъюнкцию, потому что я хочу, чтобы выбрать родителя, где каждый элемент в коллекции, как либо строка a, или строка b, или строка c. и т.д. –

3

В качестве теоретического упражнения, вы можете сделать что-то вроде этого:

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)); 

Однако этот подход не подходит для практического использования, так как она требует дополнительной join (из-за отсутствия in elements оговорки в Criteria API). Также обратите внимание, что он использует двойное отрицание (SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <condition>)), поэтому он может иметь проблемы с NULL.

EDIT: В HQL это можно записать так:

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

или

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

Но, насколько я понимаю, оба запроса не могут быть выражены в Criteria API (вы не можете написать from p.ands в подзапросе и не можете использовать in elements). Так, в Criteria API вы должны использовать дополнительные присоединиться (примечание 2 Parent с):

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

спасибо. Просто исследуя его возможности. Возможно, HQL будет лучше здесь, но мне трудно понять предложение elements(). Могу ли я использовать все элементы (parent.ands) каким-то образом? –

+0

@Andrew: Отредактировано – axtavt

+0

ах - прохладно. Это работает так, как ожидалось. Огромное спасибо. Сейчас беспокоит производительность. –

Смежные вопросы