0

这是我所拥有的:

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

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

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

有人有什么想法吗?

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

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

4

3 回答 3

1

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

@Fetch(FetchMode.JOIN)

希望这会有所帮助。

于 2011-03-10T09:36:23.853 回答
0

很抱歉这个模糊的答案,我真的从来没有经历过。我会尝试使用 ResultTransformers 来解决这个问题:

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

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

于 2011-03-09T16:18:03.713 回答
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")

也可以看看:

于 2011-03-09T15:53:29.000 回答