【问题标题】:Hibernate criteria for many-to-many entity property多对多实体属性的休眠标准
【发布时间】:2012-01-21 22:31:24
【问题描述】:
@Entity
class A {

@ManyToMany
private List<B> list;
...
}

@Entity
class B {
...
}

我想使用标准(不是 sql 查询)从 A 类中获取列表。可以这样做吗?在这种情况下,投影不起作用。

【问题讨论】:

    标签: hibernate many-to-many criteria


    【解决方案1】:

    不幸的是,标准只允许选择根实体,而不是任何连接的实体。因此,如果您的 ManyToMany 是双向的,则会更容易。您可以使用相当于

    的标准
    select b from B b inner join b.as a where a = :theA
    

    如果这不是一个选项,我认为唯一的方法是使用子查询,从而将标准编码为

    select b from B b where b.id in (select b2.id from A a inner join a.list b2 where a.id = :theAId)
    

    因此代码如下所示:

    Criteria c = session.createCriteria(B.class, "b");
    
    DetachedCriteria dc = DetachedCriteria.forClass(A.class, "a");
    dc.createAlias("a.list", "b2");
    dc.add(Restrictions.eq("a.id", theA.getId()));
    dc.setProjection(Projections.property("b2.id"));
    
    c.add(Subqueries.propertyIn("b.id", dc));
    

    【讨论】:

    • 还要注意 IN 语句有时会受到 SGDB 的限制(例如,我认为在 Oracle 中我们只能在 IN 语句上放置 1000 个值)。也许您最好运行一个单独的查询来获取列表,然后将其拆分为子列表(番石榴分区函数?)并针对所有子列表运行您的子查询
    • IN 语句在这种情况下使用子查询,而不是文字值列表。在这种情况下,子查询返回的项目数没有任何限制。
    【解决方案2】:

    你应该可以调用(假设 a 是 A 的实例)

    a.getList();
    

    如果 A 类已使用适当的 getter setter 设置。我认为不需要 Criteria 查询。

    【讨论】:

    • 这并不是因为您可以使用对象来执行此操作,因此无法使用 SQL/HQL/Criteria 查询来执行此操作,例如性能问题...
    猜你喜欢
    • 2011-04-12
    • 2014-09-30
    • 2021-09-03
    • 2010-12-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多