Hibernate提供(至少)两种解决N+1查询问题的方法。一种是将FetchMode设置为Subselect,它生成一个带有IN子句和嵌套在该IN子句中的子选择的select语句。另一种是指定BatchSize,它生成一个带有包含父项ID的IN子句的select语句。
这两种方法都可以工作,但我发现Subselect选项经常由于父查询的复杂性而遇到性能问题。另一方面,如果批处理大小很大(比如1000),则查询数量和查询复杂度非常小。
因此,我的问题是:在什么情况下会使用Hibernate的Subselect FetchMode而不是BatchSize?如果你有大量的父级条目(数千个),那么Subselect可能是有意义的,但是否有其他场景你会更喜欢使用Subselect而不是BatchSize呢?
编辑:我注意到两者处理急加载时存在差异。如果将xToMany关联设置为急加载并通过Subselect进行加载,则生成的Subselect与懒加载时生成的Subselect类似。然而,如果您指定BatchSize,则生成的查询将使用外部连接而不是单独的查询。是否有任何方法强制Hibernate在进行急加载时使用单独的批处理查询呢?