Ajuda com join hql

5 respostas
J

Galera,

tenho 3 tabelas no Oracle:

Curso
Pessoa
RelCursoPessoa

e estou tentando fazer um join segundo o código abaixo:

@SuppressWarnings("unchecked")
	@Override
	@Transactional(readOnly=true)
	public List<Curso> listarCursosPorAluno(Long cod) throws BusinessException {	
		
		String query = " select c.* from Curso c inner join RelPessoaCurso rel on c.codigo = rel.cod_curso inner join Pessoa p on p.codigo = rel.cod_pessoa and p.codigo = " + cod;
		return (List<Curso>)getHibernateTemplate().find(query);
	}

sendo que está gerando o erro:

org.hibernate.QueryException: outer or full join must be followed by path expression [ select c.* from br.com.petrobras.poc.entity.Curso c inner join RelPessoaCurso rel on c.codigo = rel.cod_curso inner join Pessoa p on p.codigo = rel.cod_pessoa and p.codigo = 169]
	at org.hibernate.hql.classic.FromParser.token(FromParser.java:193)
	at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:109)
	at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:131)
	at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:51)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:240)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:209)
	at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
	at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:868)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
	at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:866)
	at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:858)
	at br.com.petrobras.poc.persistence.dao.hibernate.RelPessoaCursoDao.listarCursosPorAluno(RelPessoaCursoDao.java:32)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy85.listarCursosPorAluno(Unknown Source)
	at br.com.petrobras.poc.business.service.RelPessoaCursoService.listarCursosPorAluno(RelPessoaCursoService.java:28)
	at br.com.petrobras.poc.business.facade.RelPessoaCursoFacade.listarCursosPorAluno(RelPessoaCursoFacade.java:28)
	at br.com.petrobras.poc.presentation.controller.jsf.bean.RelPessoaCursoController.listarCursosPorAluno(RelPessoaCursoController.java:56)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:157)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283)
	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:71)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:95)
	at javax.faces.component.UICommand.broadcast(UICommand.java:384)
	at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:324)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:299)
	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:256)
	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:469)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
	at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
	at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
	at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
	at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
	at weblogic.security.service.SecurityManager.runAs(Unknown Source)
	at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
	at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
	at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
	at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
	at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

Alguém sabe pelo amor de Deus como se faz essa query em HQL, pois já tentei de todas as formas e nada.

Vlw galera.

5 Respostas

aluisiodsv

Com o hql vc não faz querys diretamente no banco. Vc as faz pelas entidades. Provavelmente esta query aí funcionaria se fosse nativa.

Como são suas classes de entidade ? O q seria esse RelCursoPessoa ?

Deveria ser algo do tipo

String hql = "FROM Curso c" +
                  " LEFT JOIN c.pessoa p" +
                  " WHERE p.codigo = " + cod;
D

Tente assim:

String query = "select c from Curso c join c.RelPessoaCurso rel join Pessoa p with p.codigo = " + cod;

Falo!

J
dkenji:
Tente assim:
String query = "select c from Curso c join c.RelPessoaCurso rel join Pessoa p with p.codigo = " + cod;

Falo!

Cara, ai é que ta, a entidade Curso não tem um atributo do tipo RelPessoaCurso. Quando rodei essa query gerou o erro abaixo:

org.hibernate.QueryException: could not resolve property: RelPessoaCurso of: br.com.petrobras.poc.entity.Curso [select c from br.com.petrobras.poc.entity.Curso c join c.RelPessoaCurso rel join Pessoa p with p.codigo = 167]
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75)
	at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1451)
	at org.hibernate.hql.classic.PathExpressionParser.getPropertyType(PathExpressionParser.java:293)
	at org.hibernate.hql.classic.FromPathExpressionParser.end(FromPathExpressionParser.java:35)
	at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:52)
	at org.hibernate.hql.classic.FromParser.token(FromParser.java:220)
	at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:109)
	at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:131)
	at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:51)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:240)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:209)
	at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
	at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:868)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
	at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:866)
	at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:858)
	at br.com.petrobras.poc.persistence.dao.hibernate.RelPessoaCursoDao.listarCursosPorAluno(RelPessoaCursoDao.java:32)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy95.listarCursosPorAluno(Unknown Source)
	at br.com.petrobras.poc.business.service.RelPessoaCursoService.listarCursosPorAluno(RelPessoaCursoService.java:28)
	at br.com.petrobras.poc.business.facade.RelPessoaCursoFacade.listarCursosPorAluno(RelPessoaCursoFacade.java:28)
	at br.com.petrobras.poc.presentation.controller.jsf.bean.RelPessoaCursoController.listarCursosPorAluno(RelPessoaCursoController.java:56)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:157)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283)
	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:71)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:95)
	at javax.faces.component.UICommand.broadcast(UICommand.java:384)
	at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:324)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:299)
	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:256)
	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:469)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
	at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
	at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
	at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
	at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
	at weblogic.security.service.SecurityManager.runAs(Unknown Source)
	at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
	at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
	at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
	at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
	at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

segue as classes:

package br.com.petrobras.poc.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class RelPessoaCurso implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	
	@Id
	@GeneratedValue
	private Long codigo;
	
	@Column(name="cod_pessoa")
	private Long codPessoa;
	
	@Column(name="cod_curso")
	private Long codCurso;

	public Long getCodigo() {
		return codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public Long getCodPessoa() {
		return codPessoa;
	}

	public void setCodPessoa(Long codPessoa) {
		this.codPessoa = codPessoa;
	}

	public Long getCodCurso() {
		return codCurso;
	}

	public void setCodCurso(Long codCurso) {
		this.codCurso = codCurso;
	}	
}
package br.com.petrobras.poc.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Pessoa implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id @GeneratedValue
	private Long codigo;
	private String nome;
	private Date dataNascimento;
	private String endereco;
	private String telefone;

	public Long getCodigo() {
		return codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

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

	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

}
package br.com.petrobras.poc.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Curso implements Serializable{
	

	private static final long serialVersionUID = 1L;
	
	@Id @GeneratedValue
	private Long codigo;
	private String nome;
	private String endereco;
	
	@Column(name="carga_hora")
	private Integer cargaHora;
	
	
	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}
	public Long getCodigo() {
		return codigo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Integer getCargaHora() {
		return cargaHora;
	}
	public void setCargaHora(Integer cargaHora) {
		this.cargaHora = cargaHora;
	}

}
D

kra, se não tiver, cria ela… ou faça com que o hibernate trabalhe com SQL e nao HQL , ai sim acho que pode resolver

Falo!

aluisiodsv

Cara sua entidade está com muitos defeitos de orientação a objetos.
Vc não relaciona com o id. Vc relaciona a classe.

Criado 30 de novembro de 2010
Ultima resposta 30 de nov. de 2010
Respostas 5
Participantes 3