2010-07-10 58 views
4

我有一个叫做Event的Hibernate实体,它有一个一对多的元数据实体EventData。使用Criteria休眠一对多搜索

鉴于以下事件:

事件ID:1
EventHash:西兰花

用下面EventDatas:

EventDataId:1
事件ID:1
场:标签
内容:tagme

EventD ataId:2个
事件ID: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

同样,一个正常的连词是不行的,因为该条款最终成为:

((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

精湛,谢谢! – Martin 2010-08-27 09:37:48