Annotation para fazer um join com hibernate usando criteria

1 resposta
leonardo.bilar

Fala galera blz?

Andei pesquisando aqui no fórum e também na documentação do hibernate, porém não encontrei essa informação em lugar nenhum.

Estou precisando fazer uma query relacionando tabelas, gostaria de utilizar do Criteria para fazer isso.

As tabelas são Cliente e Cep, onde um Cep pode conter vários Clientes e um Cliente pode ter um Cep.
Os campos que destaquei em negrito é onde há o relacionamento.

Cliente

id
nome
idade
rg
cpf
cep

Cep

cep
endereco
bairro
cidade
uf

Gostaria de fazer o criteria utilizando o hibernate, vi que para isso são necessários fazer os mapeamentos corretos nas classes Cliente e Cep para que funcione.
Como esse mapeamento deve ser feito com Annotation? Na documentação do hibernate encontrei apenas como fazer por .xml.

Utilizei o seguinte código:

session.createCriteria(Cliente.class) .setFetchMode("cep", FetchMode.JOIN) .list();

Mas o resultado disso é o mesmo que fazer

Se alguem puder me ajudar com isso fico agradecido.

1 Resposta

leonardo.bilar

Galera depois de muito tempo de tentativas encontrei uma forma de fazer o Join funcionar usando Annotation.

As Classes ficaram da seguinte forma.

Cliente
package br.com.adv.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Cliente {

	@Id @GeneratedValue
	private Long id;
	
	private String nome;
	
	@JoinColumn
	@ManyToOne
	private Cep cep;
	private String pessoa;
	private String cgc;
	private String rg;
	private String fone;
	private String fax;
	private String email;
	private String replegal;
	private String grupo;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Cep getCep() {
		return cep;
	}
	public void setCep(Cep cep) {
		this.cep = cep;
	}
	public String getPessoa() {
		return pessoa;
	}
	public void setPessoa(String pessoa) {
		this.pessoa = pessoa;
	}
	public String getCgc() {
		return cgc;
	}
	public void setCgc(String cgc) {
		this.cgc = cgc;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public String getFone() {
		return fone;
	}
	public void setFone(String fone) {
		this.fone = fone;
	}
	public String getFax() {
		return fax;
	}
	public void setFax(String fax) {
		this.fax = fax;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getReplegal() {
		return replegal;
	}
	public void setReplegal(String replegal) {
		this.replegal = replegal;
	}
	public String getGrupo() {
		return grupo;
	}
	public void setGrupo(String grupo) {
		this.grupo = grupo;
	}
}
Cep
package br.com.adv.modelo;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Cep {

	@Id
	@JoinColumn
	private String cep;
	private String endereco;
	private String bairro;
	private String cidade;
	private String uf;
	
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public String getCidade() {
		return cidade;
	}
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	public String getUf() {
		return uf;
	}
	public void setUf(String uf) {
		this.uf = uf;
	}
}
Criteria utilizado
session.createCriteria(Cliente.class)
		.setFetchMode("cep", FetchMode.JOIN)
		.list()
Resultado do hibernate:
Hibernate: 
    select
        this_.id as id0_1_,
        this_.cep_cep as cep11_0_1_,
        this_.cgc as cgc0_1_,
        this_.email as email0_1_,
        this_.fax as fax0_1_,
        this_.fone as fone0_1_,
        this_.grupo as grupo0_1_,
        this_.nome as nome0_1_,
        this_.pessoa as pessoa0_1_,
        this_.replegal as replegal0_1_,
        this_.rg as rg0_1_,
        cep2_.cep as cep1_0_,
        cep2_.bairro as bairro1_0_,
        cep2_.cidade as cidade1_0_,
        cep2_.endereco as endereco1_0_,
        cep2_.uf as uf1_0_ 
    from
        Cliente this_ 
    left outer join
        Cep cep2_ 
            on this_.cep_cep=cep2_.cep
[br.com.adv.modelo.Cliente@b7c0a73]

Espero que isso ajude aos que tiveram problema igual ou parecido.

Criado 7 de março de 2012
Ultima resposta 8 de mar. de 2012
Respostas 1
Participantes 1