1

这可能是一个非常简单的答案,因为我相信这并不少见。我看到一些类似的问题,但似乎没有什么可以描述我的问题。

我有两个对象:一辆车和一个人。它们是多对多的关系,即一辆汽车可以由多个人拥有,而一个人可以拥有多辆汽车。 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 休眠,我会得到我期望的结果,所以我有理由确定标准不是问题。

我可以理解为什么会发生这种情况,但我不确定如何在不遍历每辆车并为每辆车运行驱动程序的情况下绕过它。如果可能的话,我想避免这样做,并希望得到任何建议。

提前致谢!

4

2 回答 2

3

您是否希望每辆汽车的 Drivers 集合仅包含符合您条件的人(即超过 25 岁)?换句话说,您不希望 Drivers 集合包含 25 岁以上的人吗?

如果是这种情况,那么您将需要使用 ResultTransformer(请参阅Hibernate 文档的第 15.4 节),因为 Hibernate 在返回结果之前不会预先过滤集合。

但是,如果问题是 Drivers 集合被延迟加载并且这是不可取的,那么设置获取模式(我通常使用 JOIN,因为不推荐使用 IIRC FetchMode.EAGER)应该可以解决问题:

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();
于 2010-10-05T05:29:01.317 回答
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

于 2010-10-04T17:33:23.790 回答