【问题标题】:Avoid N+1 select with native sqlQuery?使用本机 sqlQuery 避免 N+1 选择?
【发布时间】:2011-07-12 00:30:46
【问题描述】:

这就是我所拥有的:

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

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

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

有人知道吗?

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

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

【问题讨论】:

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


    【解决方案1】:

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

    @Fetch(FetchMode.JOIN)

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      另请参阅:

      【讨论】:

      • 哦,对不起,我忘记了:数据库是 DB2,带逗号的内连接被转换为“交叉连接”,它崩溃了。
      【解决方案3】:

      抱歉,我的回答含糊不清,我真的从未经历过。我会尝试使用 ResultTransformers 来解决这个问题:

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-28
        • 1970-01-01
        • 2012-05-19
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多