Hibernate: 使用多对多关联表的Criteria查询?

17

考虑以下两个关系:

@Entity class Foo {
    @Id id;

    @ManyToMany
    @JoinTable(name = "ATag", 
         joinColumns = @JoinColumn(name = "foo_id"),
         inverseJoinColumns = @JoinColumn(name = "tag_id"))
    Set<Tag> tags;
}

@Entity class Tag {
    @Id Long id;
    String name;
}

在关联表ATag中没有对应的实体类。现在,我想要使用Criteria仅获取所有名为'tag1'的标签的Foo实例,这是否可能?

子查询可能有所帮助,但是我无法为不存在的ATag.class创建DetachedCriteria。

1个回答

33

我刚好处理了这个问题。 你正在以表格的方式思考,而不是对象的方式。 只需引用tags.name,让Hibernate来处理剩下的部分:

Criteria crit = session.createCriteria(Foo.class);
crit.createAlias("tags", "tagsAlias");
crit.add(Restrictions.eq("tagsAlias.name", someValue);
如果你观察 Hibernate 生成的 SQL,你会发现它使用了 join 表。

1
重要的是要注意使用对象的属性而不是对象本身。Hibernate使用限制条件(Restrictions)时并不仅仅使用POJO定义的主键。在这个例子中,使用了对象标签的属性名称。我曾经浪费了很多时间,试图设置整个对象,而不是明确指定需要在条件谓词下检查哪个属性。 - Luiz Feijão Veronesi
3
为什么使用别名很必要?不能直接用 tags.name 而不是 tagsAlias.name 吗? - sp00m
创建别名会自动触发内部连接。 - derrik
1
对于一个标签来说运行良好,但是如何更新这个条件以选择包含名称为“tag1”和“tag2”的标签的Foo示例? - Escander
@Escander 只需创建一个 for 循环,然后在其中逐个添加一个限制条件。 - imran.razak
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接