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