Pessoal, acho que essa pergunta é velha, mas procurei documentações a rodo, e inclusive aqui no fórum e não achei resposta.
A questão é simples:
Como forçar outer joins em vez de selects separados para classes mapeadas com many to one? Tenho as seguintes classes:
@Entity
class Pai{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
Long id;
@OneToMany(mappedBy="pai", cascade=CascadeType.PERSIST,
fetch=FetchType.LAZY)
List<Filho> filhos = new LinkedList<Filho>();
}
@Entity
class Filho{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
Long id;
@ManyToOne
Pai pai;
public Filho(){
super();
}
public Filho(Pai pai){
this.pai = pai;
}
}
Filho possui um pai associado.
A seguinte query: “select f from Filho f” gera 2 selects:
Hibernate:
select
filho0_.id as id24_,
filho0_.pai_id as pai2_24_
from
Filho filho0_
Hibernate:
select
pai0_.id as id17_0_
from
Pai pai0_
where
pai0_.id=?
Forçando a query com um fetch join o resultado vem da maneira desejada : “select f from Filho f left join fetch f.pai”
select
filho0_.id as id24_0_,
pai1_.id as id17_1_,
filho0_.pai_id as pai2_24_0_
from
Filho filho0_
left outer join
Pai pai1_
on filho0_.pai_id=pai1_.id
Então pergunto, como faço que os many to ones sejam carregados por padrão com um outer join? Para grafos de objetos significativos apenas colocando fetchs fiz a consulta ficar 10x mais rápida. E até me pergunto o do porque este não ser o procedimento padrão. Em fim, já tentei usar as anotações @Fetch, @LazyToOne e não deu em nada. Li coisas referente a desativar proxies e afins, mas achei tudo muito sinistro.
Alguém saberia me dizer o que fazer?
Obrigado.