我在映射中有一个关联到一个急切加载的集合(lazy =“false”fetch =“subselect”)。在进行查询时,如何使用Hibernate以编程方式关闭它?
答案 0 :(得分:6)
事实上,它应该是另一种方式。您可以在映射中将其关闭,并在查询中使用“fetch”在特定用例上激活它。
这就是Hibernate团队看待它的方式。在Hibernate中没有办法创建一个为属性指定“no-fetch”的请求......
答案 1 :(得分:0)
我有一种情况,由于历史原因,在几个一对多依赖项之间急切地获取。多年来,许多地方依赖它,因此很难关闭。 但是在某些情况下,急切的提取会阻碍:对于表中的每个较大的选择,它会为每个对象的每个集合产生100个小子查询。 我找到了解决这个问题的方法,并没有真正覆盖了渴望的提取,但对我来说同样有用:只需创建一个查询即可同时执行所有子提取。这将对数据库进行1次物理查询,而不是让hibernate遍历依赖图并生成100个查询。
所以我换了
Query q = session.createQuery("from Customer c");
通过
Query q = session.createQuery("from Customer c " +
"left join fetch c.vats v " +
"left join fetch v.klMemos bk " +
"left join fetch bk.ferryKlMemos");
1客户有很多增值税号,1个增值税号有很多klmemos等等。旧的情况将首先仅获取客户,然后休眠将开始逐个获取每个依赖的集合。 第二种形式将在一个本机查询中加载所有内容,而hibernate将找到填充对象缓存中的eager集合所需的全部内容。 希望它对某人有帮助。 注意:我仍然认为你应该尽量避免急切的提取; - )