2010-10-04 92 views
1

这可能是一个超级简单的答案,因为我确信它并不少见。我看到一些类似的问题,但似乎没有描述我的问题。过滤器懒惰初始化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休眠正在生成,所以我相当确定这个标准不是问题。

我可以理解为什么发生这种情况,但我不知道如何绕过它而无需遍历每辆车并在每个车上运行查询。如果可能,我想避免这样做,并希望得到任何建议。

提前致谢!

回答

3

是你希望的驱动程序收集每辆汽车将只包含谁符合您的标准(即超过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(); 
+0

太棒了,谢谢。你提到的第一个案例是我想要的。 – 2010-10-06 18:32:34

1

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

+0

这似乎不能解决问题。我再次检查了Hibernate的调试输出,并且它没有返回或保存条件之外的任何对象。同样的事情发生虽然:当我迭代列表,我得到我不想要的对象。也许问题在别处? – 2010-10-04 20:00:46

相关问题