親と子の2つのエンティティがあります。そして、それらの間には@OneToOneの関係があります。
私は次のクエリを持っています:親pから左結合フェッチp.child。
親に存在しない子キー(たとえば-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);