Select Hibernate many-to-many (RESOLVIDO)

5 respostas
guihgf_10

e ae galera blz ?

então estudando hibernate venho tendo a seguinte dificuldade, possuo uma table usuario com chave primaria usuLogin e uma table Curso com chave primaria cursoCod, ambas formam um nxn formando a tabela curso_usuario, ao tentar dar o select abaixo ele diz que não encontra cursocod em usuario, mas quero que ele pegue do relacionamento:

Session s=HibernateUtil.getSessionFactory().getCurrentSession(); Query q=s.createQuery("select c.cursoCod, c.cursoNome from Curso c inner join c.usuarios as u where u.usuLogin=:usu and c.cursoCod=u.cursoCod").setParameter("usu", usuario); return q.list();

Resumindo quero comparar a chave primária do curso, com uma das chaves primárias da nxn. O mapeamento está correto, acredito que o select que possa estar errado, mas por mal conhecer o hibernate não estão conseguindo acessar o relacioamento.

Valeu galera, vocês sempre estão ajudando, até mais.

5 Respostas

yorgan

Acho que você se enganou na parte c.cursoCod=u.cursoCod.
Acredito que o usuário não tenha o atributo cursoCod, certo?

Você deve fazer algo +/- assim:

SELECT c FROM Curso c 
    JOIN c.cursoUsuarios crs 
    JOIN crs.usuario u
 WHERE u.usuLogin=:usu

E no .setParameter(“usu”, usuario) você está passando um String, certo?

[]'s
Daniel

guihgf_10

Então cursoCod não fica em usuário e sim em curso_usuario(a n pra n) mudei o select:

public List<Object[]> ListaCurso(String usuario) { Session s=HibernateUtil.getSessionFactory().getCurrentSession();
Query q=s.createQuery("select c.cursoCod, c.cursoNome from Curso c where exists(select u.cursoCod from c.usuarios u where u.usuLogin =: usuario and c.cursoCod=u.cursoCod").setParameter("usuario", usuario);
return q.list();

}

ele é igual a isso no sql:

select c.cursoCod, c.cursoNome from Curso c where exists(select u.cursoCod from curso_usuario u where u.usuLogin ='guihgf' and c.cursoCod=u.cursoCod)

Agora o erro é esse:

org.hibernate.hql.ast.QuerySyntaxException: expecting CLOSE, found 'null' near line 1, column 152 [select c.cursoCod, c.cursoNome from bean.Curso c where exists(select u.cursoCod from c.usuarios u where u.usuLogin =: usuario and c.cursoCod=u.cursoCod]

georgesq

é interessante ver as tabelas que foram montadas, assim vc vai ver onde ficam os campos :wink:

[s]

guihgf_10

O problema é o sguinte pessoal, abaixo o mapeamento de curso:

&lt;?xml version=&quot;1.0&quot;?&gt; &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt; &lt;!-- Generated 15/02/2011 23:40:25 by Hibernate Tools 3.2.1.GA --&gt; &lt;hibernate-mapping&gt; &lt;class name="bean.Curso" table="curso" catalog="mlearning_final"&gt; &lt;id name="cursoCod" type="java.lang.Integer"&gt; &lt;column name="CursoCod" /&gt; &lt;generator class="identity" /&gt; &lt;/id&gt; &lt;property name="cursoNome" type="string"&gt; &lt;column name="CursoNome" length="100" not-null="true" /&gt; &lt;/property&gt; &lt;property name="cursoSenha" type="string"&gt; &lt;column name="CursoSenha" length="10" not-null="true" /&gt; &lt;/property&gt; &lt;set name="conteudos" inverse="true"&gt; &lt;key&gt; &lt;column name="CursoCod" /&gt; &lt;/key&gt; &lt;one-to-many class="bean.Conteudo" /&gt; &lt;/set&gt; &lt;set name="usuarios" table="curso_usuario"&gt; &lt;key&gt; &lt;column name="CursoCod" not-null="true" /&gt; &lt;/key&gt; &lt;many-to-many entity-name="bean.Usuario"&gt; &lt;column name="UsuLogin" length="10" not-null="true" /&gt; &lt;/many-to-many&gt; &lt;/set&gt; &lt;set name="discussoeses" inverse="true"&gt; &lt;key&gt; &lt;column name="CursoCod" /&gt; &lt;/key&gt; &lt;one-to-many class="bean.Discussoes" /&gt; &lt;/set&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt;

Abaixo o de usuário:

&lt;?xml version=&quot;1.0&quot;?&gt; &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt; &lt;!-- Generated 15/02/2011 23:40:25 by Hibernate Tools 3.2.1.GA --&gt; &lt;hibernate-mapping&gt; &lt;class name="bean.Usuario" table="usuario" catalog="mlearning_final"&gt; &lt;id name="usuLogin" type="string"&gt; &lt;column name="UsuLogin" length="10" /&gt; &lt;generator class="assigned" /&gt; &lt;/id&gt; &lt;property name="usuSenha" type="string"&gt; &lt;column name="UsuSenha" length="10" not-null="true" /&gt; &lt;/property&gt; &lt;property name="usuNome" type="string"&gt; &lt;column name="UsuNome" length="50" not-null="true" /&gt; &lt;/property&gt; &lt;set name="notas" inverse="true"&gt; &lt;key&gt; &lt;column name="UsuLogin" length="10" /&gt; &lt;/key&gt; &lt;one-to-many class="bean.Nota" /&gt; &lt;/set&gt; &lt;set name="cursos" table="curso_usuario"&gt; &lt;key&gt; &lt;column name="UsuLogin" length="10" not-null="true" /&gt; &lt;/key&gt; &lt;many-to-many entity-name="bean.Curso"&gt; &lt;column name="CursoCod" not-null="true" /&gt; &lt;/many-to-many&gt; &lt;/set&gt; &lt;set name="discussoeses" inverse="true"&gt; &lt;key&gt; &lt;column name="UsuLogin" length="10" /&gt; &lt;/key&gt; &lt;one-to-many class="bean.Discussoes" /&gt; &lt;/set&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt;

Ambas fazem um many-to-many para a tabela curso_usuario, o problema que eu quero acessar a tabela, porém
o netbenas não mapeou nela, o problema é o seguinte, esse select está errado no acesso da tabela:

Erro:
c.usuarios is not mapped

Ou o netbeans deveria ter mapeado a tabela curso_usuario ?

guihgf_10

Simples senhores:

Query q=s.createQuery("select c.cursoCod, c.cursoNome from Curso c inner join c.usuarios u where u.usuLogin=:usu").setParameter("usu", usuario);

Utilizei a documentação oficial do Hibernate, nada melhor

Valeu!

Criado 23 de fevereiro de 2011
Ultima resposta 26 de fev. de 2011
Respostas 5
Participantes 3