【问题标题】:Hibernate generates multiple SQL queries even when I use Left join fetch即使我使用 Left join fetch,Hibernate 也会生成多个 SQL 查询
【发布时间】:2012-04-15 09:35:27
【问题描述】:

我有一个有趣的休眠问题,模型如下所示:

@NamedQueries({
    @NamedQuery(name = "A.test", query = "SELECT DISTINCT a FROM A a LEFT JOIN FETCH a.pk.b WHERE a.pk.b.pk.c.id = :cId AND a.pk.b.pk.d.id = :dId")
})
@Entity
@Table(name = "AT")
public class A implements Serializable {

    @EmbeddedId
    private APK pk;
}

@Embeddable
public class APK implements Serializable {

    @ManyToOne
    @JoinColumns({@JoinColumn(name = "***", referencedColumnName = "***"),
                  @JoinColumn(name = "***", referencedColumnName = "***")
    })
    private B b;
}

@Entity
@Table(name = "BT")
public class B implements Serializable {

    @EmbeddedId
    private BPK pk;
}


@Embeddable
public class APK implements Serializable {

    @ManyToOne
    @JoinColumn(name = "***", referencedColumnName = "***")
    private C c;

    @ManyToOne
    @JoinColumn(name = "***", referencedColumnName = "***")
    private D d;
}

问题在于命名查询会进行额外的 SQL 查询... 问题是什么? 谢谢!

【问题讨论】:

    标签: hibernate jpa fetch jpql


    【解决方案1】:

    默认情况下,Hibernate 急切地获取多对一的引用。在您的命名查询中选择“A”时,有许多多对一的引用将得到解决,这些将对应于您所看到的 SQL 查询。通过在多对一注释上明智地放置延迟加载,可以覆盖休眠的这种默认行为,即:

    @ManyToOne(fetch=FetchType.LAZY)
    

    【讨论】:

    • 谢谢!它现在正在工作。但是我已经读过@ManyToOne 关联中的 fetchtype 设置对查询没有任何影响。我想我错过了一些东西,所以我回到手册。 :S
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2019-12-30
    • 1970-01-01
    • 2011-10-13
    • 2021-11-26
    • 1970-01-01
    • 2019-03-07
    • 2021-10-19
    相关资源
    最近更新 更多