java - 使用 Criteria 的 Hibernate 一对多搜索

标签 java hibernate criteria one-to-many

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

给定以下事件:

事件编号:1
事件哈希:西兰花

具有以下事件数据:

事件数据ID:1
EventId:1
字段:标签
内容:tagme

事件数据ID:2
事件编号: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++;
}

不起作用; 重复关联路径:Event.EventData

同样,普通的连词不起作用,因为子句的结尾是:

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

而且,遗憾的是,数据库字段不能同时具有两个不同的值。

关于如何清理它的任何想法,或者是恢复到 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)));  

/* 如果字段的大小总是一个,你也可以使用 Restrictions.eq("fields", "tag")*/

关于java - 使用 Criteria 的 Hibernate 一对多搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220873/

相关文章:

java - 如何获得 Ivy 的依赖

java - JPA-继承

java - 带有枚举的 JPA 2 Criteria API

excel - Excel中的表格到具有多个条件的一列

c# - 包含以下划线开头的字符串的列表排序

java - 尝试更新记分牌 - Java

java - Hibernate 在读取之前永久清除所有现有数据

java - 哪个 : no java for my user on linux

hibernate - 如何将环境细节移到 EAR 之外

java - Spring 数据 : How to set GenerationType strategy while working with @Embeddable and @Embedded