Sous-sélection Hibernate vs récupération par lots

Hibernate fournit (au moins) deux options pour se déplacer le N+1 de la requête problème. L'un est le réglage de la FetchMode de sous-sélection, ce qui génère un select avec une clause et une sous-sélection au sein de cette clause. L'autre est de spécifier un BatchSize, ce qui génère un select avec une clause contenant les parents Id.

À la fois le travail, mais je trouve que la sous-sélection de l'option s'exécute souvent dans des problèmes de performance en raison de la requête pour les parents d'être complexe. D'autre part, avec un grand BatchSize (disons 1000), le nombre de requêtes et de la complexité de ces requêtes sont très petites.

Ma question est donc: quand souhaitez-vous utiliser Hibernate sous-sélection FetchMode sur BatchSize? Sélectionner probablement de sens que si vous avez un très grand nombre de parents d'entrées (en milliers), mais existe-il d'autres scénarios où vous préférez une sous-sélection de BatchSize?

EDIT: j'ai remarqué une différence entre les deux lorsque vous traitez avec impatient de chargement. Si vous avez un xToMany association ensemble à être chargé avec impatience et par une sous-sélection, il génère une sous-sélection, comme il le ferait s'il était paresseux. Si vous spécifiez un BatchSize toutefois, la requête générée permet d'utiliser une jointure externe à la place d'une autre requête. Est-il un moyen de forcer à Hibernate d'utiliser une autre par lot de requête lors du chargement avec impatience?

source d'informationauteur Zecrates