【问题标题】:Hibernate: Criteria with many-to-many join table?Hibernate:多对多连接表的标准?
【发布时间】:2011-10-08 08:46:47
【问题描述】:

考虑以下两个关系:

@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没有对应的实体类。现在,我想获取所有带有名为“tag1”的标记的 Foo 实例,是否可以仅使用 Criteria?

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

【问题讨论】:

    标签: hibernate criteria


    【解决方案1】:

    刚刚处理了这个确切的问题。您在表格中思考,而不是在对象中思考。只需引用 tags.name 并让 Hibernate 处理其余的事情:

    Criteria crit = session.createCriteria(Foo.class);
    crit.createAlias("tags", "tagsAlias");
    crit.add(Restrictions.eq("tagsAlias.name", someValue);
    

    如果您观察 SQL Hibernate 的输出,您会发现它使用了连接表。

    【讨论】:

    • 重要的是要注意使用对象的属性而不是对象本身。 Hibernate using Restrictions 不仅仅使用 POJO 定义的主键。这里的示例使用对象标签的属性名称。我浪费时间尝试设置整个对象,而不是明确说明需要在条件谓词下检查哪个属性。
    • 为什么需要使用别名?你不能简单地使用tags.name 而不是tagsAlias.name 吗?
    • 创建别名会导致内部连接自动发生。
    • 适用于一个标签,但如何更新此条件以选择包含名为“tag1”和“tag2”的标签的 Foo?
    • @Escander 只需创建一个 for 循环并在其中一次添加一个限制
    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多