这可能是一个非常简单的答案,因为我确信这并不罕见。我看到了一些类似的问题,但似乎没有任何描述我的问题。
我有两个对象:汽车和人。他们处于多对多的关系中,即汽车可以由多人拥有,而一个人可以拥有多辆汽车。 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 hibernate正在生成,我会得到我期望的结果,所以我有理由相信标准不是问题。
我可以理解为什么会发生这种情况,但我不知道如何绕过它而不迭代每辆车并在每辆车上运行查询。如果可能的话,我想避免这样做,并希望得到任何建议。
提前致谢!
答案 0 :(得分:3)
您是否希望每辆车的司机系列只包含符合您标准的人(即超过25人)?换句话说,您不希望Drivers集合包含超过25的人吗?
如果是这种情况,则需要使用ResultTransformer(请参阅Hibernate文档的section 15.4),因为Hibernate在返回结果之前不会预先过滤集合。
如果问题是驱动程序集合是延迟加载的并且这是不可取的,那么设置获取模式(我通常使用JOIN,因为IIRC FetchMode.EAGER已被弃用)应该可以解决问题:
baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
.setFetchMode("drivers", FetchMode.JOIN)
// add additional restrictions here
.list();
答案 1 :(得分: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