我正在使用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。你有什么想法吗?
感谢。
答案 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连接。