Hibernate投影在多对多属性上

时间:2011-04-21 10:49:14

标签: hibernate many-to-many projection

我正在使用Hibernate 3.3.2。我有A类,它有一个属性b,它将多对多关系映射到B。

A类具有以下映射:

<set name="b" table="a_b" lazy="true">
   <key column="id_a"/>
   <many-to-many class="B" column="id_b" outer-join="auto" />
</set>

我正在尝试以下方法:

Criteria c = HibernateUtil.getSession().createCriteria(A.class);
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id_a"), "id_a");
pl.add(Projections.property("b"), "b");
c.setProjection(pl);
c.add(Restrictions.eq("id", id));
Object o = c.list();

此代码不加载任何B的实例;返回的ArrayList中与b对应的元素为null。你有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

您提供的代码会获取特定A行的B实体列表。您应该以相反的方式进行连接,获取B并加入A以限制查询:

Criteria c = HibernateUtil.getSession().createCriteria(B.class);
c.createCriteria("a").add(Restrictions.eq("id", id));
List<B> o = (List<B>) c.list();

上面的代码可以解决问题。

答案 1 :(得分:0)

由于fetchType是惰性的,你需要为b:c.createAlias(...)创建一个别名,以便hibernate将A与B连接。