使用Criteria进行一对多的Hibernate搜索

时间:2010-07-10 21:18:09

标签: java hibernate criteria one-to-many

我有一个叫做Event的Hibernate实体,它有一对多元数据实体EventData。

鉴于以下事件:

EventId:1
EventHash:西兰花

使用以下EventDatas:

EventDataId:1
事件ID:1个
字段:标签
内容:tagme

EventDataId:2
EventId:1
字段:标签
内容:anotherTag

如何创建Criteria查询以检索具有BOTH标签“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 个答案:

答案 0 :(得分:5)

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”)* /