如何使用hibernate以编程方式关闭即时抓取?

如何使用hibernate以编程方式关闭即时抓取?,hibernate,subquery,eager,Hibernate,Subquery,Eager,我将关联映射到一个急切加载的集合(lazy=“false”fetch=“subselect”)。当我执行查询时,如何使用Hibernate以编程方式关闭该功能?事实上,应该是另一种方式。您可以在映射中关闭它,并在查询中使用“fetch”在特定用例中激活它 这就是Hibernate团队的看法。在Hibernate中,无法创建一个为属性指定“不获取”的请求…我遇到过一种情况,由于历史原因,在多个一对多依赖项之间进行了急切获取。多年来,许多地方开始依赖它,因此很难关闭它。 然而,在某些情况下,急于获取

我将关联映射到一个急切加载的集合(lazy=“false”fetch=“subselect”)。当我执行查询时,如何使用Hibernate以编程方式关闭该功能?

事实上,应该是另一种方式。您可以在映射中关闭它,并在查询中使用“fetch”在特定用例中激活它


这就是Hibernate团队的看法。在Hibernate中,无法创建一个为属性指定“不获取”的请求…

我遇到过一种情况,由于历史原因,在多个一对多依赖项之间进行了急切获取。多年来,许多地方开始依赖它,因此很难关闭它。 然而,在某些情况下,急于获取会造成阻碍:对于表上的每一个较大的选择,它会为每个对象的每个集合生成100个小的子查询。 我找到了一种解决这个问题的方法,并没有真正覆盖急切获取,但对我来说同样有用:只需创建一个一次执行所有子访问的查询。这将对数据库进行1次物理查询,而不是让hibernate遍历依赖关系图并生成100次查询

所以我换了

Query q = session.createQuery("from Customer c");

1个客户有多个增值税编号,1个增值税编号有多个KL备忘录等。旧的情况是首先只获取客户,然后hibernate开始逐个获取每个依赖集合。 第二个表单将在一个本地查询中加载所有内容,hibernate将在对象缓存中找到填充急切集合所需的所有内容。 希望它能帮助别人。
注意:我仍然认为您应该尽量避免急于获取;-)

我也是这么想的。如果有这样的方法,我只是想试试运气。谢谢,不客气。你还需要考虑其他问题吗?我打算接受这个答案。
Query q = session.createQuery("from Customer c " +
            "left join fetch c.vats v " +
            "left join fetch v.klMemos bk " +
            "left join fetch bk.ferryKlMemos");