这就是我所拥有的:
Entity A -> oneToMany -> Entity B -> manyToOne -> Entity C
因为我必须在A和另一个实体X之间没有外键的情况下进行内连接,所以我必须使用createSqlQuery而不是createQuery。 (显然我无法更改数据库)
所以,我能做的就是一个不错的2N + 1选择。 (使用fetch = EAGER或手动,它是相同的。)
有人有任何想法吗?
编辑:使用@BatchSize我将选择的数量从A减少到B.我现在有一个N + 2选择。
编辑2:我不能使用内部连接(使用逗号),因为数据库是一个旧的DB2,它崩溃了。
答案 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
不幸的是,关于它的文档很少,因此,您最好的选择是查看测试套件,看看它是如何使用的。