大多数Hibernate关联都支持"fetch"参数:
fetch="join|select"
"select"是默认值.
如何决定使用哪一个关联?
我尝试将所有内容从"选择"更改为"加入"应用程序范围 - 生成的查询数量减少了10倍,但性能保持完全相同(甚至变得更糟糕).
谢谢.
加入应该解决n + 1问题.如果您有10个父母,每个父母有10个孩子,则加入将需要一个查询,并且选择将需要11个(一个用于父母,一个用于每个父母的子女).如果数据库与应用程序位于同一服务器上,或者网络速度非常快,那么这可能不是什么大问题,但如果每个数据库调用都有延迟,则可以相加.join方法在初始查询上的效率稍差,因为您复制了每一行中的父列,但您只对数据库进行了一次往返.
一般来说,如果我知道我需要所有父母的孩子,我就去加入.如果我只需要几个父母的孩子,我会选择.
Select将通过向数据库发出新查询来获取子项.Join将通过将子项添加到父查询中来获取子项.这就是为什么你看到类似的性能,即使查询数量下降.
选择:
SELECT * FROM parent WHERE id=(whatever) SELECT * FROM child WHERE id=(parent.child.id)
加入:
SELECT * FROM parent LEFT OUTER JOIN child ON parent.child.id=child.id WHERE parent.id=(whatever)
至于什么时候使用一个...不完全确定.它可能取决于数据库系统.如果一个总是比另一个好,我怀疑他们会费心给你选择!如果你看到每个人都有类似的表现,我不会担心.