过滤延迟初始化的 Hibernate 集合
-
27-09-2019 - |
题
这可能是一个非常简单的答案,因为我确信这并不罕见。我看到一些类似的问题,但似乎没有描述我的问题。
我有两个对象:一辆车和一个人。他们处于多对多关系,即一辆车可以由多个人拥有,一个人可以拥有多辆车。 Car
有一组延迟初始化的 Drivers
:
@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY)
private Set<Person> people;
我想查找车主年龄在 25 岁以下的所有蓝色汽车:
Criteria foo = persistenceManager.createCriteria(Car.class, "myCarAlias");
Criteria bar = foo.createCriteria("drivers", "myDriverAlias");
//add restrictions on foo and bar for blue and age, respectively
baz = foo.list();
我的问题是当我迭代列表并调用 getDrivers()
在每辆车上,它都会初始化集合并获取该车的所有驾驶员。我猜是 .list()
我跑的每辆车都没有设置结果。
如果我手动运行 hibernate 生成的 SQL,我会得到预期的结果,因此我有理由确定标准不是问题。
我可以理解为什么会发生这种情况,但我不确定如何在不迭代每辆车并在每辆车上运行驾驶员查询的情况下解决它。如果可能的话,我想避免这样做,并希望得到任何建议。
提前致谢!
解决方案
您是否希望每辆车的驾驶员集合仅包含符合您条件的人员(即已超过 25 岁)?换句话说,您不希望 Drivers 集合包含 25 岁以上的人员?
如果是这种情况,那么您将需要使用 ResultTransformer (请参阅 第15.4节 Hibernate 文档)因为 Hibernate 在返回结果之前不会预先过滤集合。
然而,如果问题是 Drivers 集合被延迟加载,而这是不可取的,那么设置获取模式(我通常使用 JOIN,因为 IIRC FetchMode.EAGER 已被弃用)应该可以解决问题:
baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
.setFetchMode("drivers", FetchMode.JOIN)
// add additional restrictions here
.list();
其他提示
部15.5。基本上你可以设置读取策略的标准查询,应优先于已为关系所规定的基本获取策略。
从文档的示例
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
和文档 http://docs.jboss.org/hibernate/core /3.3/reference/en/html/querycriteria.html