ManyToOne - Forçando Joins em vez de Selects

2 respostas
israel.fonseca

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.

2 Respostas

maior_abandonado

da uma pesquisada na anotação @Fetch, com ela vc escolhe entre fazer join um select separado ou uma subquery

israel.fonseca

Opa, descobri. Parece que a HQL ta acima da lei, e por padrão ela faz selects extras, diferente de Criteria que da preferencia a Joins.

Criado 25 de novembro de 2010
Ultima resposta 26 de nov. de 2010
Respostas 2
Participantes 2