2011-12-16 57 views
3
@Entity 
class A { 

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

@Entity 
class B { 
... 
} 

我想从使用条件(不是sql查询)的类中获取列表。这样做有可能吗?这种情况下的投影不起作用。多对多实体属性的休眠标准

回答

4

不幸的是,标准只允许选择根实体,而不是任何联合实体。如果你的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)); 
+0

人所以请注意,IN语句有时会受到SGDB的限制(例如,我认为在Oracle中,我们只能在IN语句中输入1000个值)。也许你最好运行一个单独的查询来获取列表,然后将它拆分为子列表(guava分区函数?),并再次运行子查询所有子列表 – 2011-12-16 11:57:31

-1

,你应该能够调用(假设为A的实例)

a.getList(); 

如果A类已设置了适当的getter setter方法。我看不到标准查询的需要。

+1

这不是因为你可以做到这一点的对象,它不能是能够与SQL做/ HQL /标准查询,演出的问题为例有用...... – 2011-12-16 11:56:22