我有两个实体:Parent和Child。它们之间存在@OneToOne关系。
我有以下查询:from Parent p left join fetch p.child。
如果 Parent 中有一行不存在子键(例如 -1),则休眠会为每种情况发出额外的查询。
Hibernate:
select
parent0_.PARENT_ID as PARENT1_2_0_,
child1_.CHILD_ID as CHILD1_3_1_,
parent0_.CHILD_ID as CHILD2_2_0_,
child1_.NAME as NAME3_1_
from
PARENT parent0_
left outer join
CHILD child1_
on parent0_.CHILD_ID=child1_.CHILD_ID
Hibernate:
select
child0_.CHILD_ID as CHILD1_3_0_,
child0_.NAME as NAME3_0_
from
CHILD child0_
where
child0_.CHILD_ID=?
这是代码:
@Entity
@Table(name = "PARENT")
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PARENT_ID", nullable = false)
private int id;
@OneToOne(optional = true)
@JoinColumn(name = "CHILD_ID")
@NotFound(action = NotFoundAction.IGNORE)
private Child child;
}
@Entity
@Table(name="CHILD")
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CHILD_ID", nullable = false)
private int id;
@Column(name = "NAME")
private String name;
}
为什么会这样?如何防止这个额外的sql?
这是数据库生成的代码:
create table PARENT(
PARENT_ID INTEGER GENERATED ALWAYS AS IDENTITY,
CHILD_ID INTEGER,
PRIMARY KEY (PARENT_ID)
);
create table CHILD(
CHILD_ID INTEGER GENERATED ALWAYS AS IDENTITY,
NAME VARCHAR(100) NOT NULL,
PRIMARY KEY (CHILD_ID)
);
insert into PARENT(CHILD_ID) values(-1);