Duvida Hibernate...join entre duas tabelas

4 respostas
P

Olá pessoal,

não sei se estou fazendo certo mais estou querendo fazer um join entre
duas tabelas no banco e mostrar o resultado.

Mas só define a classe das duas tabelas (Empresas e Consultores)

E utilizo uma tabela associativa na minha query que não defini

nos arquivos hbm …

O que fazer o que estou fzendo de errado …

Se alguem puder me ajudar agradeceria…

abss

public class Testa2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//Session sessao = HibernateUtility.getSession(); 
		SessionFactory sf = new Configuration().configure("br/com/curso/hibernate.cfg.xml").buildSessionFactory();

		Session s = sf.openSession();
		Transaction tx = s.beginTransaction(); 
 
		Query select = s.createQuery("select emp.empresa,emp.idempresa,emp.valorhora from Empresas as emp,ConsultoresEmpresas as con where emp.idempresa  = con.idempresa and emp.empresa like 'eu%'");

		select.setFirstResult(0); 
		select.setMaxResults(5); 

		List <Empresas>lista = select.list();
		//
		for(Empresas sa :  lista)		{
			System.out.println("Id: " + sa.getIdEmpresa()  );
			System.out.println("Empresa: " + sa.getEmpresa()  );			
			System.out.println("Valor Hora: " + sa.getValorhora()  );
			System.out.println("------------------------------------------" );
		}
		tx.commit(); 

		s.close(); 


	}
}

erro :

Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: ConsultoresEmpresas is not mapped [select emp.empresa,emp.idempresa,emp.valorhora from br.com.wincomp.curso.Empresas as emp,ConsultoresEmpresas as con where emp.idempresa  = con.idempresa and emp.empresa like 'eu%']
	at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
	at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
	at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
	at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
	at br.com.wincomp.curso.Testa2.main(Testa2.java:25)

empresas

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
		"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="br.com.wincomp.curso.Empresas" table="empresas">
	  <id name="idEmpresa" column="idEmpresa" type="int">
	  	<generator class="native"/>
	  </id>
	  <property name="empresa"/>
	  <property name="valorhora"/>
      
      <set name = "consultores" table = "consultoresempresas" inverse="true">
	     <key column = "idempresa"/>
	     <many-to-many column = "idconsultor"  class = "br.com.wincomp.curso.Consultores"/>
	</set>
      
	 </class>
 

</hibernate-mapping>

–consultores

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
		"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="br.com.wincomp.curso.Consultores" table="consultores">
	  <id name="idConsultor" column="idConsultor" type="int">
	  	<generator class="native"/>
	  </id>
	  <property name="nome"/>
	  <property name="nascimento"/>
      
      <set name ="empresas" table="consultoresempresas">
         <key column="idConsultor"/>
         <many-to-many column="idEmpresa" class="br.com.wincomp.curso.Empresas"/>
      </set>
      
	 </class>
 
</hibernate-mapping>

4 Respostas

P

em anexo as classes definidas :

public class Consultores {
	 private int idConsultor;
	 private String nome;
	 private String nascimento;
	 private Set empresas = new HashSet();
	 
	 
	 public Consultores(){
		 
	 }
	 public Set getEmpresas() {
		return empresas;
	}
	public void setEmpresas(Set empresas) {
		this.empresas = empresas;
	}
	
	public int getIdConsultor() {
		return idConsultor;
	 }
	public void setIdConsultor(int idConsultor) {
		this.idConsultor = idConsultor;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getNascimento() {
		return nascimento;
	}
	public void setNascimento(String nascimento) {
		this.nascimento = nascimento;
	}
 
 
}
public class Empresas {

	private int idEmpresa;
	private String empresa;
	private long valorhora;
	private Set <Consultores> consultores = new HashSet();
	
	
	public Set<Consultores> getConsultores() {
		return consultores;
	}
	public void setConsultores(Set<Consultores> consultores) {
		this.consultores = consultores;
	}
	public int getIdEmpresa() {
		return idEmpresa;
	}
	public void setIdEmpresa(int idEmpresa) {
		this.idEmpresa = idEmpresa;
	}
	public String getEmpresa() {
		return empresa;
	}
	public void setEmpresa(String empresa) {
		this.empresa = empresa;
	}
	public long getValorhora() {
		return valorhora;
	}
	public void setValorhora(long valorhora) {
		this.valorhora = valorhora;
	}
	
	
}
M

Não entendi bem a sua query. Ela está fazendo uma junção com consultores mas não usa nenhum dado de lá.
Se o que você quer é saber as empresas que tem algum consultor, então seria algo assim:

select emp from Empresas where exists elements(emp.consultores)

se não era isso eu não entendi. Ajuda se explicar o que a consulta deveria fazer.
De qualquer forma nunca vai usar o nome da tabela associativa. Você já colocou ela no mapeamento many-to-many.

P

Obrigado pelo retorno.

O queria é o seguinte vou ter uma tela onde vou entrar com um nome de um consultor

e vou mostrar a tela com o resultado contendo todas as empresas desse nome de consultor…

abs

M

select emp from Empresas emp where elements(emp.consultores).nome = :nome

Criado 7 de janeiro de 2008
Ultima resposta 7 de jan. de 2008
Respostas 4
Participantes 2