Hibernate один-ко-многим поиск с критериями - PullRequest
4 голосов
/ 11 июля 2010

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

С учетом следующего события:

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

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

EventDataId: 1
EventId: 1
Поле: тег
Содержимое: tagme

EventDataId: 2
EventId: 1
Поле: тег
Содержимое: anotherTag

Как создать запрос Criteria для извлечения события, имеющего ОБА теги «anotherTag» и «tagme»?В 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

Точно так же обычная конъюнкция не работает, потому что предложение заканчивается как:

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

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

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

1 Ответ

5 голосов
/ 12 июля 2010
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 ("fields", "tag") также * /

...