过滤器懒惰初始化Hibernate集合
这可能是一个超级简单的答案,因为我确信它并不少见。我看到一些类似的问题,但似乎没有描述我的问题。过滤器懒惰初始化Hibernate集合
我有两个对象:一辆车和一个人。他们处于多对多的关系中,即一辆车可以拥有多个人,一个人可以拥有多辆车。 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()
并没有在每辆车上设置结果。
我得到了我期望的结果,如果我手动运行SQL休眠正在生成,所以我相当确定这个标准不是问题。
我可以理解为什么发生这种情况,但我不知道如何绕过它而无需遍历每辆车并在每个车上运行查询。如果可能,我想避免这样做,并希望得到任何建议。
提前致谢!
是你希望的驱动程序收集每辆汽车将只包含谁符合您的标准(即超过25)的人?换句话说,你不希望包含25岁以上人员的Drivers集合?
如果是这种情况,那么您将需要使用ResultTransformer(请参阅Hibernate文档的section 15.4),因为Hibernate在返回结果之前不会过滤集合。
然而,如果问题是驱动器集合被懒惰加载,这是不理想的则设定取模式(I通常使用加入,因为IIRC FetchMode.EAGER被废弃)应解决的问题:
baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
.setFetchMode("drivers", FetchMode.JOIN)
// add additional restrictions here
.list();
hibernate文档的第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
这似乎不能解决问题。我再次检查了Hibernate的调试输出,并且它没有返回或保存条件之外的任何对象。同样的事情发生虽然:当我迭代列表,我得到我不想要的对象。也许问题在别处? – 2010-10-04 20:00:46
太棒了,谢谢。你提到的第一个案例是我想要的。 – 2010-10-06 18:32:34