当前位置: 首页 > 面试题库 >

hibernate子选择与批量获取

姚胡媚
2023-03-14
问题内容

Hibernate提供(至少)两个选项来解决N +
1查询问题。一个是将FetchMode设置为Subselect,这会生成一个带有IN子句的选择以及此IN子句中的子选择。另一个是指定BatchSize,它会生成一个带有包含父母ID的IN子句的选择。

两者都可以工作,但是我发现由于对父项的查询很复杂,Subselect选项经常遇到性能问题。另一方面,对于大的BatchSize(例如1000),查询的数量和这些查询的复杂度非常小。

因此,我的问题是:何时在BatchSize上使用Hibernate的Subselect
FetchMode?如果您有大量的父条目(数千个),则Subselect可能有意义,但是在其他情况下,您还是希望Subselect优于BatchSize吗?

编辑:我注意到在处理渴望加载时两者之间的差异。如果您设置了一个xToMany关联集,该关联集将通过子选择快速加载,则它会生成一个子选择,就像它是惰性的一样。但是,如果指定BatchSize,则生成的查询将使用外部联接而不是单独的查询。有什么方法可以强制Hibernate在急切加载时使用单独的批处理查询?


问题答案:

我不使用subselect,因为它很难控制。在具有复杂业务逻辑和庞大团队工作的大型系统中,很难说出使用了哪些查询。在您完全知道执行哪个查询的特定情况下,子选择可能会起作用。

批量读取有一些很大的优点。它并不总是最快的,但通常足够快。另一方面,它非常稳定,没有任何副作用,并且对业务逻辑完全透明。我从来没有使用高于100的批处理值。将N
+ 1减少到合理数量的查询就足够了。



 类似资料:
  • 问题内容: 我想使用Criteria API通过从搜索值中获取输入来选择实体。一个文档可以有更多的收件人。收件人有许多子类 如何选择所有带有特定名字的ReciepientAccount的文档?我需要搜索所有子类并将它们与OR连接。有优雅的方法吗? 问候m 问题答案: 以下应该工作:

  • 我有一个基于Java8 Spring Boot 2.3.3的应用程序(使用Hibernate5.4.20),我有一个Postgreql。我想最终了解使用数据库视图和@Sub选择是否更好(对于性能)。 简单概述一下:我有一个实体“Book”和3个实体“BookRank”(用户给书打1到10颗星)、“BookComment”(用户对书的评论)、“BookLike”(用户把书的评论放在一起),每个实体都

  • 我有一张桌子,大约有500万张记录。我想从这个表中读取所有的记录,并对它们进行一些处理。现在我想批量查询这些记录,比如一次1000条,处理它们并获取下一个1000条记录,等等。

  • 我刚开始冬眠。我有两张桌子,有一对多的关系。有两个表格: 这是一个父类,它与图像表有一对多关系 现在我想使用父类的id(即:pashminaId)从类中选择一个 如: 选择IMAGE_NAMETBL_IMAGEPASHMINA_ID='some_digit'; 我怎么能在图像类中传递pashminaId,因为没有它只有一个父类的对象创建。 那么,我如何在Hibernate中实现这一点? 谢谢!希望

  • 问题内容: 我对这两个选择器有些困惑。 后代 选择器是否: 选择所有内它是否是一个即时descedent?因此,如果处于另一个之内,它将仍然被选中? 然后是 子 选择器: 有什么不同?一个孩子意味着 直系 孩子吗?例如。 与 是否都会被选中? 问题答案: 只要想一想英语中的“孩子”和“后代”是什么意思: 我的女儿既是我的孩子,又是我的后代 我的孙女不是我的孩子,但她是我的后代。

  • 我们当前的代码库具有以下重要特征: 一个代码库-但是很多批处理(我们在批处理之间重用代码) 目前,我们在代码库中有多个main()方法,并且只有不同的shell脚本来调用正确的main类。 我希望在Spring Batch中解决以下问题: null 提前谢了。