2011-03-09 59 views
0

这是我有:避免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,并且它崩溃。

回答

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

参见:

+0

哦,对不起,我忘记了:数据库是DB2,内部连接用逗号转换为“交叉连接”并崩溃。 – 2011-03-09 15:55:35

1

为了避免N + 1,你可以在地图领域

@Fetch(FetchMode.JOIN)语句

希望这将帮助使用下面的代码。