@Entity
class A {
@ManyToMany
private List<B> list;
...
}
@Entity
class B {
...
}
我想从使用条件(不是sql查询)的类中获取列表。这样做有可能吗?这种情况下的投影不起作用。多对多实体属性的休眠标准
@Entity
class A {
@ManyToMany
private List<B> list;
...
}
@Entity
class B {
...
}
我想从使用条件(不是sql查询)的类中获取列表。这样做有可能吗?这种情况下的投影不起作用。多对多实体属性的休眠标准
不幸的是,标准只允许选择根实体,而不是任何联合实体。如果你的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));
,你应该能够调用(假设为A的实例)
a.getList();
如果A类已设置了适当的getter setter方法。我看不到标准查询的需要。
这不是因为你可以做到这一点的对象,它不能是能够与SQL做/ HQL /标准查询,演出的问题为例有用...... – 2011-12-16 11:56:22
人所以请注意,IN语句有时会受到SGDB的限制(例如,我认为在Oracle中,我们只能在IN语句中输入1000个值)。也许你最好运行一个单独的查询来获取列表,然后将它拆分为子列表(guava分区函数?),并再次运行子查询所有子列表 – 2011-12-16 11:57:31