gpt4 book ai didi

Hibernate @OneToOne 即使使用 @Fetch(FetchMode.JOIN) 也会执行多个查询

转载 作者:行者123 更新时间:2023-12-02 22:40:48 24 4
gpt4 key购买 nike

考虑EmployeeAddress 关系。 EmployeeAddress 之间存在一对一的映射。以下为型号:

@Entity
@Table(name = "Address")
public class Address
{
@Id
@GeneratedValue
@Column(name = "addressId")
private int addressId;

@Column(name = "city")
private String city;

.
.
}

@Entity
@Table(name = "Employee")
public class Employee
{
@Id
@Column(name = "employeeId")
private int employeeId;

@Column(name = "name")
private String name;

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "addressId")
@Fetch(FetchMode.JOIN)
private Address address;

.
.
}

现在,当我执行以下 HQL 查询时,它会在内部生成两个查询。一个用于获取员工,另一个用于获取地址。

“来自员工,其中 id =” + 1

Hibernate 生成的 SQL 查询

hibernate :从员工employee0_中选择employee0_.employeeId作为employeeId0_,employee0_.addressId作为addressId0_,employee0_.name作为name0_,其中employee0_.employeeId=1

hibernate :从地址address0_中选择address0_.addressId作为addressId1_0_,选择address0_.city作为city1_0_,其中address0_.addressId=?

由于我使用 @Fetch(FetchMode.JOIN),我希望 Hibernate 仅执行 1 个带有连接的查询来一次性获取员工和地址数据。

知道为什么它要执行两个查询吗?如何让 Hibernate 使用 join 仅执行一个查询?

我使用的是 Hibernate 3.3.0。

最佳答案

使用显式 HQL 查询“FROM Employee WHERE id = "+ 1”,Hibernate 将不遵循带注释的 Fetch 模式。您需要在 HQL 查询中指定联接或在条件中指定 fetch 模式。

当您使用查询接口(interface) (Session.createQuery) 时,Hibernate 3.x 会忽略 Fetch Mode 注释,因此在这种情况下,您必须将 INNER JOIN FETCH 子句添加到查询的 FROM 部分。

关于Hibernate @OneToOne 即使使用 @Fetch(FetchMode.JOIN) 也会执行多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21852419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com