java - 过滤延迟初始化的 Hibernate 集合

标签 java hibernate collections criteria lazy-initialization

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

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

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

提前致谢!

最佳答案

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

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

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

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();

关于java - 过滤延迟初始化的 Hibernate 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857603/

相关文章:

java - jbossHome 'null' 必须存在

java - 将Spring 3.1迁移到Spring 4 : org. springframework.web.context.support.ServletContextFactoryBean

c# - 如何重载 Collection(Of T) 的 Items 访问器?

java - Collections.shuffle 只工作一次

java - 计算 Java 类的代码行数

java - 如何在 View 完全渲染后进行回调?

java - 解密 JSON 响应 googles topic api

java - HQL:查询java.util.Map的值

java - 使用 Look up map 比每次从 DB 加载慢?怎么会?

java - 使用 Java8 流 API 从集合中删除最大值(或最小值)