HIbernate выборка присоединения выдачи дополнительных операторов SQL - PullRequest
1 голос
/ 22 сентября 2010

Рассмотрим следующий родительский класс, имеющий две ссылки ManyToOne.

@Entity
@Table(name = "PARENT")
public class Parent {

private static final long serialVersionUID = 3730163805206219313L;

@Id
@SequenceGenerator(name = "SEQ#PARENT", sequenceName = "SEQ#PARENT", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ#PARENT")
@Column(name = "ID")
private long id;

@ManyToOne(optional = false, fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="CHILD_1_ID", referencedColumnName="FK_COLUMN_NAME")
private Child childInstance1;

@ManyToOne(optional = false, fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="CHILD_2_ID", referencedColumnName="FK_COLUMN_NAME")
private Child childInstance2;

@Column(name = "USER_ID")
private String userId;              
}

Я использую следующий hql-запрос для загрузки родительского экземпляра:

"from Parent p  join fetch p.childInstance1 join fetch p.childInstance2 where p.userId = :userId"

Это всегда приводит к спящемувыдача отдельных операторов SQL для загрузки строк childInstance1, даже если он выполняет выборочное соединение.

Любая помощь во избежании лишних операторов SQL приветствуется.

1 Ответ

1 голос
/ 22 сентября 2010

Я не могу воспроизвести. Даны следующие лица:

@Entity
public class Parent3764122 {
    @Id @GeneratedValue
    private long id;

    @ManyToOne(optional = false/*, fetch=FetchType.EAGER*/) // EAGER by default
    //@Fetch(FetchMode.JOIN) // unnecessary
    @JoinColumn(name="CHILD_1_ID")
    private Child3764122 childInstance1;

    @ManyToOne(optional = false/*, fetch=FetchType.EAGER*/) // EAGER by default
    //@Fetch(FetchMode.JOIN) // unnecessary
    @JoinColumn(name="CHILD_2_ID")
    private Child3764122 childInstance2;

    @Column(name = "USER_ID")
    private String userId;
    ...
}

и

@Entity
public class Child3764122 {
    @Id @GeneratedValue
    private Long id;

    ...
}

Следующий HQL-запрос:

from Parent3764122 p join fetch p.childInstance1 join fetch p.childInstance2 where p.id = :id

Создает следующий SQL:

select
    parent3764x0_.id as id129_0_,
    child37641x1_.id as id130_1_,
    child37641x2_.id as id130_2_,
    parent3764x0_.CHILD_1_ID as CHILD3_129_0_,
    parent3764x0_.CHILD_2_ID as CHILD4_129_0_,
    parent3764x0_.USER_ID as USER2_129_0_ 
from
    Parent3764122 parent3764x0_ 
inner join
    Child3764122 child37641x1_ 
        on parent3764x0_.CHILD_1_ID=child37641x1_.id 
inner join
    Child3764122 child37641x2_ 
        on parent3764x0_.CHILD_2_ID=child37641x2_.id 
where
    parent3764x0_.id=?

Работает как положено с Hibernate 3.3.0.SP1, Hibernate Annotations 3.4.0.GA.

...