gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:00:32 24 4
gpt4 key购买 nike

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

我有两个对象:汽车和人。他们是多对多的关系,即一辆汽车可以由多个人拥有,一个人可以拥有多辆汽车。 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com