Mar*_*tin 4 java hibernate criteria one-to-many
我有一个名为Event的Hibernate实体,它有一对多的元数据实体EventData.
鉴于以下事件:
EventId:1 EventHash:西兰花
使用以下EventDatas:
EventDataId:1
EventId:1
Field:tag
Content:tagme
EventDataId:2
EventId:1
Field:tag
Content: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++;
}
Run Code Online (Sandbox Code Playgroud)
不起作用; duplicate association path: Event.EventData
类似地,正常的连接不起作用,因为该子句最终为:
((ed3_.field='tag' and ed3_.content='anotherTag') and (ed3_.field='tag' and ed3_.content='tagme'))
Run Code Online (Sandbox Code Playgroud)
而且,遗憾的是,数据库字段不能同时具有两个不同的值.
关于如何清理它的任何想法,或者是恢复到HQL的唯一选择?
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)));
Run Code Online (Sandbox Code Playgroud)
/*如果字段的大小总是一个,你可以使用Restrictions.eq("fields","tag")*/