【问题标题】:Hibernate one-to-many search with CriteriaHibernate 使用 Criteria 进行一对多搜索
【发布时间】:2011-03-14 08:21:00
【问题描述】:

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

鉴于以下事件:

事件 ID:1
EventHash:西兰花

使用以下 EventData:

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

EventDataId:2
事件 ID:1
字段:标签
内容:另一个标签

如何创建条件查询来检索同时具有“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?

【问题讨论】:

    标签: java hibernate criteria one-to-many


    【解决方案1】:
    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") */

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2012-07-09
      • 2010-09-20
      • 1970-01-01
      相关资源
      最近更新 更多