Annotation para fazer um join com hibernate usando criteria

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.

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

[code]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;
}

}
[/code]

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.