避免使用本机sqlQuery进行N + 1选择?

时间:2011-03-09 15:48:43

标签: java hibernate hql select-n-plus-1

这就是我所拥有的:

Entity A -> oneToMany -> Entity B -> manyToOne -> Entity C

因为我必须在A和另一个实体X之间没有外键的情况下进行内连接,所以我必须使用createSqlQuery而不是createQuery。 (显然我无法更改数据库)

所以,我能做的就是一个不错的2N + 1选择。 (使用fetch = EAGER或手动,它是相同的。)

有人有任何想法吗?

编辑:使用@BatchSize我将选择的数量从A减少到B.我现在有一个N + 2选择。

编辑2:我不能使用内部连接(使用逗号),因为数据库是一个旧的DB2,它崩溃了。

3 个答案:

答案 0 :(得分:1)

要避免N + 1,您可以在地图字段中使用以下代码

  

@Fetch(FetchMode.JOIN)语句

希望这会有所帮助。

答案 1 :(得分:0)

你可以使用这样的东西,但我不确定它如何与复杂的查询一起使用:

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")

另见:

答案 2 :(得分:0)

对于模糊的回答,我很抱歉,我从未体验过这一点。我会尝试使用ResultTransformers来解决这个问题:

http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/transform/ResultTransformer.html

不幸的是,关于它的文档很少,因此,您最好的选择是查看测试套件,看看它是如何使用的。