Como fazer innerjoin em hibernate

Boa tarde, estou com a seguinte duvida, como fazer inner join usando hibernate, nem sei se eh isso realmente mas eu to usando hibernate tem pouco tempo e me deparei com esse problema, se alguem puder me ajudar. obrigado


Feito o seu inner join ;)

Feito o seu inner join :wink:

[quote=clone_zealot]select a.campoTabelaUm, b.campoTabelaDois from TabelaUm a inner join a.associacaoTabelaUm b

Feito o seu inner join ;)[/quote]

desse jeito eu estaria fazendo comando sql, mas tem como fazer inner join pelo hibernate nao tipo usando criteria?

eu tenho a seguinte situaçao tenho uma classe que pega os servidores que aquela aplicaçao possui entao tenho q fazer um inner join pra comparar mas como que eu faço isso eu tenho o seguinte codigo eu sei que ta errado, ele recebe o nome de um servidor

[code]public List getAplicationListServer(String name){
try{
logger.info(“Obtendo a lista de Aplicações do banco de dados.”);

		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Criteria crit = session.createCriteria(Application.class);
		crit.add(Restrictions.eq("name", name));
		List results = crit.list();
		
		sessionFactory.close();
		
		logger.info("Lista de Aplicações obtida com sucesso.");
		
		return results;
	}catch (Exception e){
		logger.error("Não foi possível obter a lista de Aplicações.\nMotivo: " + e.getMessage());
	}
	
	return null;
}[/code]

Sua dúvida é a mesma que a minha.

Para fazer isso achei algo mais ou menos assim , o “many to One”, que seria parecido com isso :

As tabelas são :

Create Table Tipo  ( Descr Varchar(50)
                      Cod  AutoInc Not Null Unique); 

Create Table Users ( Nome Varchar(10) Not Null Unique,
                     Codigo Integer not Null,
                     Foreign Key(Codigo) References Tipo(Cod) );

A clausula SQL que faria o join é o seguinte :

Select Users.Nome , Tipo.Descr
From Users
Inner Join Tipo on Tipo.Cod = Users.Codigo 

Em apenas 3 linhas tenho o join feito …

Já no Hibernate , pelo oq eu vi até agora , seria o seguinte :

Os beans são :

Tipo.java

public class Tipo {

	private String descr;
	private Integer cod;

	public void setDescr(String descr){
	  this.descr = descr;
	}

	public String getDescr(){
	  return descr;
	}

	public void setCod(Integer cod){
	  this.cod = cod;
	}

	public Integer getCod(){
	  return cod;
	}
}

Users.java

public class Users {
	private String nome;
	private Tipo tipo;  // Mapeia o bean da tabela tipo

	public void setNome(String nome);
	  this.nome = nome;
	}

	public String getNome(){
	  return Nome;
	}


	public void setNome(Tipo tipo);
	  this.tipo = tipo;
	}

	public Tipo getTipo(){
	  return tipo;
	}

}

Os mapeamentos em xml das tabelas são :

Mapeamento da tabela Tipo

Tipo.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="Tipo" table="tipo">
		<id name="cod" column = "cod" >
			<generator class="native"></generator>
		</id>

		<property name = "descr" column = "descr"> </property>
		
	</class>
</hibernate-mapping>

mapeamento da tabela Users

Tipo.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="Users" table="users">
	<id name = "nome" column = "nome> </id>
        <!-- Aqui faz o "mapeamento" do join -->
	<many-to-one name="Tipo" column="codigo" lazy="false" fetch="join" cascade="all"></many-to-one>
</class>
</hibernate-mapping>

Bom não se se esta é a única saída para fazer o join , como tbm estou começando agora (em jee e hibernate) achei isso ai…

Se não existe nenhuma forma de fazer o mapeamento a partir de uma query (e não diretamernte da tabela) o esquema para melhorar o negocio pode ser usar views no banco …

pelo oq eu vi usando esta parafernalha toda o Hibernate irá realizar 2 consultas !!! agora fico imaginando , se eu estiver certo,

isso é meio tosco … pois imagine só um relacionamento de 2 tabelas grandes , o quanto irá demorar a consulta (isso é , se ela conseguir ser rodada)

Agora fica minha dúvida : “Há alguam forma de fazer o mapeamento direto de umaquery ?”

2 “Erratas”

O “select” q o Hibernate faz é na verdade um Outer Join

e ele só faz masi q uam consulta quando o fetch=“Select”