这不是一个技术问题,只是我没有得到的语法修正。
我有hibernate 3.6,我已经在xml文件中映射了我的模型类。这些xml文件中提到的默认类型是这些类是懒惰的。由于其硬编码,我无法改变这种行为。
我试图带来的模型看起来像这样。
class A {
private int id;
private B b;
private C c;
}
在我的案例中,需要急切地加载B和C类。
所以我写了这样的查询。
from A.class.getName() a where a.id = :id;
在此查询中,我在哪里放置fetch关键字。 下面会抛出错误:
from A.class.getName a fetch where a.id = :id;
在互联网上的示例中,他们正在对查询进行一些连接,然后得到一些像这样的值:
from Cat as cat inner join fetch cat.mate left join fetch cat.kittens
但是,在我的情况下,所有连接都在xml文件内部完成。我不必在查询中加入联接。那么我在哪里放&#34; fetch&#34; <_p>指示同时启动所有链接类(B和C)的关键字。
注意:
答案 0 :(得分:5)
语法是
select a from A a
left join fetch a.b
left join fetch a.c
where a.id = :id
the documentation的相关部分:
“fetch”连接允许使用单个select来初始化值的关联或集合及其父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外连接和延迟声明。有关详细信息,请参阅Section 20.1,“提取策略”。
from Cat as cat inner join fetch cat.mate left join fetch cat.kittens
答案 1 :(得分:1)
我发现了另外一个答案,而且非常有趣。
如果您愿意编写本机SQL查询,可以在hiberate中使用addJoin()方法。在文档here中,在&#34; 16.1.3部分下。处理协会和集合&#34;,
示例是:
sess.createSQLQuery("SELECT c.ID, NAME, BIRTHDATE, DOG_ID, D_ID, D_NAME FROM CATS c, DOGS d WHERE c.DOG_ID = d.D_ID")
.addEntity("cat", Cat.class)
.addJoin("cat.dog");
It is possible to eagerly join in the Dog to avoid the possible extra roundtrip for initializing the proxy. This is done via the addJoin() method, which allows you to join in an association or collection.
因此,您可以轻松地急切地加载所有相关的类。