Como fazer innerjoin em hibernate

5 respostas
G

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

5 Respostas

C
Feito o seu inner join ;)

Feito o seu inner join :wink:

G

clone_zealot:
select a.campoTabelaUm, b.campoTabelaDois from TabelaUm a inner join a.associacaoTabelaUm b

Feito o seu inner join ;)

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

G

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

public List<Application> 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;
	}
A

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 ?”

A

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”

Criado 29 de outubro de 2009
Ultima resposta 30 de out. de 2009
Respostas 5
Participantes 3