避免N + 1选择与本机sqlQuery?
问题描述:
Entity A -> oneToMany -> Entity B -> manyToOne -> Entity C
而且因为我必须做的内部连接,而不A和另一实体x与外键,我必须使用createSqlQuery而不是的createQuery。 (显然我不能改变数据库)
所以,我所能做的只是一个很好的2N + 1选择。 (用fetch = EAGER或手动,它是一样的)。
有人有什么想法吗?
编辑:@BatchSize我减少了选择从A到B的数量。我现在有一个N + 2选择。
编辑2:我不能使用内部连接(使用逗号),因为数据库是旧的DB2,并且它崩溃。
答
您可以使用这样的事情,但我不知道它是如何将复杂的查询工作:
s.createSQLQuery(
"SELECT {a.*}, {b.*}, {c.*} " +
"FROM X x JOIN A a ON ... JOIN B b ON ... JOIN C c ON ...")
.addEntity(A.class, "a")
.addJoin(B.class, "a.b")
.addJoin(C.class, "a.b.c")
参见:
答
抱歉,模糊的答案,我真的没有经历过这个。我会尝试使用ResultTransformers来解决这个问题:
http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/transform/ResultTransformer.html
不幸的是,有关于它的文档很少,所以,你最好的选择是看测试套件,看看它是如何使用的。
答
为了避免N + 1,你可以在地图领域
@Fetch(FetchMode.JOIN)语句
希望这将帮助使用下面的代码。
哦,对不起,我忘记了:数据库是DB2,内部连接用逗号转换为“交叉连接”并崩溃。 – 2011-03-09 15:55:35