如何在Hibernate查询语言中使用fetch

如何在Hibernate查询语言中使用fetch,hibernate,hql,Hibernate,Hql,这不是一个技术问题,只是一个语法修正,我没有得到 我使用了hibernate 3.6,并在xml文件中映射了我的模型类。这些xml文件中提到的默认类型是将这些类作为延迟类引入。由于它是硬编码的,我无法改变这种行为 我想带的模型是这样的 class A { private int id; private B b; private C c; } from A.class.getName() a where a.id = :id; 在我的例子中,B类和C类需要急切地加载 所

这不是一个技术问题,只是一个语法修正,我没有得到

我使用了hibernate 3.6,并在xml文件中映射了我的模型类。这些xml文件中提到的默认类型是将这些类作为延迟类引入。由于它是硬编码的,我无法改变这种行为

我想带的模型是这样的

class A {
    private int id;
    private B b;
    private C c;
}
from A.class.getName() a where a.id = :id;
在我的例子中,B类和C类需要急切地加载

所以我写了这样的查询

class A {
    private int id;
    private B b;
    private C c;
}
from A.class.getName() a where a.id = :id;
在这个查询中,fetch关键字放在哪里。 下面一个抛出错误:

from A.class.getName a fetch where a.id = :id;
在internet上的示例中,他们对查询执行一些联接,然后获得如下值:

from Cat as cat inner join fetch cat.mate left join fetch cat.kittens
但是,在我的例子中,所有连接都是在xml文件内部完成的。我不必在查询中进行连接。那么,我应该把“fetch”关键字放在哪里,以声明同时非惰性地启动所有链接类(B和C)

注:

  • 我不能使用CriteriaAPI,因为我不想在我的项目中添加额外的JAR
  • 语法是

    select a from A a
    left join fetch a.b
    left join fetch a.c
    where a.id = :id
    
    相关部分:

    “fetch”联接允许使用单个select将值的关联或集合与其父对象一起初始化。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外部联接和延迟声明。有关更多信息,请参阅“获取策略”

    from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens
    

    我又找到了一个答案,非常有趣

    如果您愿意编写本机SQL查询,可以在Hibrate中使用addJoin()方法。在文件中,在“16.1.3.处理关联和收款”一节下

    例如:

    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.
    

    因此,您可以像这样轻松地加载所有关联的类。

    您所说的
    是什么意思?所有连接都是在xml文件内部完成的。
    ?为什么你们不能用你们放在网上的东西作为样本
    从内部连接获取A.b作为b,其中A.id=:id
    在我的xml文件中,我已经定义了一对多和多对多关系。那么为什么我需要显式地加入hql呢?我只想使用hql查询告诉它获取所有关联的类,而不是再次加入。是否正确?
    fetch
    用于覆盖关系的行为。如果将
    b
    作为
    lazy
    加载的关联,可以使用fetch强制hibernate加载
    b
    。如果
    b
    eager
    加载的,则不需要
    fetch
    。但这是我的问题!!您说过fetch用于覆盖该行为。我的行为被定义为延迟加载,我希望它覆盖以执行渴望。但是我不想加入,因为它已经在xml文件中完成了。在不需要加入的情况下,fetch的语法是什么?好的,现在我明白了。因此,如果我只想初始化B类,我会编写这样的查询:from A.class.getName()A left join fetch A.B其中A.id=:id,这样在A类中,只有B是渴望的,但C仍然是懒惰的?对吗?嗨。只是为了对你的答案有所贡献——我又找到了一个解决方案,并将其发布在这里。你觉得它对吗?
    class A {
        private int id;
        private B b;
        private C c;
    }
    
    from A.class.getName() a where a.id = :id;