当前位置: 首页 > 知识库问答 >
问题:

hibernate生成查询而不需要所有外部联接获取

上官华池
2023-03-14

我有5个实体:

@Entity
public class A {
    @OneToMany(mappedBy="a", fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    private Set<B1> b1s;

    @OneToMany(mappedBy="a", fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    private Set<B2> b2s;
}

@Entity
public class B1 {
    @ManyToOne
    @JoinColumn(name="c")
    private C c;
}

@Entity
public class B2 {
    @ManyToOne
    @JoinColumn(name="c")
    private C c;
}

@Entity
public class C {
    @OneToMany(mappedBy="d", fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    private Set<D> ds;
}

@Entity
public classD {

}

所以简而言之,一个急切地连接两个实体集B1和B2,每一个急切地连接(隐含地)一个实体C,而实体C又急切地连接一个实体集D。

加载A对象时,生成的查询如下所示

select (...) from A a0 
left outer join B1 b1 on a0.id=b1.aid
    left outer join C c1 on b1.cid=c1.id
        left outer join D d1 on c1.id=d1.cid
left outer join B2 b2 on a0.id=b2.aid
    left outer join C c2 on b2.cid=c2.id
where a0.id=?

共有1个答案

孙文康
2023-03-14

的确,这似乎是一个bug或一个不完整的特性。我还能够在一个更简单的场景中重现它:

@Entity
public class A {
    @OneToMany(fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @JoinColumn
    private Set<B> bs1;

    @OneToMany(fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @JoinColumn
    private Set<B> bs2;
}

@Entity
public class B {
    @OneToMany(fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @JoinColumn
    private Set<C> cs;
}

@Entity
public class C {

}

按id加载A时,将生成以下联接:

from
    A a0_ 
left outer join
    B bs1x1_ 
        on a0_.id=bs1x1_.bs1_id 
left outer join
    C cs2_ 
        on bs1x1_.id=cs2_.cs_id 
left outer join
    B bs2x3_ 
        on a0_.id=bs2x3_.bs2_id 

因此,如果您真的想在一个查询中获取所有内容,就必须使用HQL:

select a from A a 
left join fetch a.b1s b1 
left join fetch b1.c c1 
left join fetch c1.ds 
left join fetch a.b2s b2 
left join fetch b2.c c2 
left join fetch c2.ds 
where a.id = ?
 类似资料:
  • 我有一个名为的实体,另一个名为。 这就是它们之间的关系: 这是“我的存储库”实体中的查询,用于恢复具有一点Comptage属性的Computer: 问题是我很好地恢复了所选点comptage的computer,但只恢复了具有参数确定关系的computer。 在我的数据库中,有可能竞争对手没有参数化的梅苏尔数据。 我如何恢复没有参数的计算机程序和具有参数的计算机程序(在同一个queryBuilder

  • 我需要从中选择所有行,如果选择位置子句匹配,则从中选择匹配这是我的外部与子查询,但它失败了。有人可以帮忙吗?

  • 我想用预处理器实现虚拟视图。一个简单的例子: HQL之前: 有效HQL后: 本质上,我需要一种在执行查询之前处理查询的方法(而不是在运行中创建视图,这会产生很高的成本)。

  • subcompany.hbm.xml 子单位表 branch.java 指定表 我需要帮助编写条件查询使用提供的SQL。

  • 我有一个复合密钥的实体。订阅和源具有多对多的关系。 我正在使用Spring数据存储库来处理它。 当我尝试使用方法saveAll时,它会抛出 “com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:未知列'subscripti0_.subscription_id'” 同时尝试在保存后返回值。 Hibernate生成以下查询: 所以,现在我

  • 那么如何将此更改为jpql查询代码呢?谢谢