2010-07-10 4 views
4

У меня есть объект Hibernate, называемый Event, который имеет объект метаданных «один ко многим», EventData.Hibernate поиск один-ко-многим с критериями

Учитывая следующее событие:

EventId: 1
EventHash: брокколи

Со следующим EventDatas:

EventDataId: 1
EventId: 1
поля: тег
Содержание : tagme

EventD ataId: 2
EventId: 1
полей: тег
Содержание: anotherTag

Как создать запрос Критерии для получения события, которое имеет как метки "anotherTag" и "Тагме"? В SQL, я бы присоединиться к таблице event_data один раз для каждого тега разыскивается, но я могу только показаться, чтобы создать один псевдоним для отношений Event.EventData, т.е.

int inc = 0; 

Conjunction junc = Restrictions.conjunction(); 

for (String tag : tags) { 
    crit.createAlias("e.EventData", "ed"+inc); 
    junc.add(
     Restrictions.and(
      Restrictions.eq("ed"+inc+".field", "tag"), 
      Restrictions.eq("ed"+inc+".content", tag) 
     ) 
    ); 
    inc++; 
} 

не работает; duplicate association path: Event.EventData

Аналогично, нормальный Conjunction не работает, потому что положение заканчивается как:

((ed3_.field='tag' and ed3_.content='anotherTag') and (ed3_.field='tag' and ed3_.content='tagme')) 

и, к сожалению, поле базы данных не может иметь два разных значения одновременно.

Любые идеи относительно того, как я могу очистить это, или это единственный вариант, возвращающийся к HQL?

ответ

4
List fields = new ArrayList(1); 
fields.add("tag") 

List contents = new ArrayList(tags.size()); 
for (String tag : tags) { 
    contents.add(tag); 
} 

session.createCriteria(Event.class); 
criteria.createCriteria("eventDatas").add(Restrictions.and(Restrictions.in("field", fields), Restrictions.in("content", contents))); 

/* если размер полей всегда один, вы можете использовать Restrictions.eq ("поля", "тег") также */

+0

Superb, спасибо! – Martin

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