Consulta HQL entre duas ou mais tabelas [RESOLVIDO]

Olá pessoal,

Estou com uma dúvida relativamente simples: quero exibir uma tabela com valores de outras tabelas (através das chave estrangeiras) no JSP.
Estou usando Hibernate e Struts 1.x …

Por exemplo:

Tenho duas tabelas:

Uma de tarefa:

@Entity @Table(name="TarefaEmap")
public class TarefaEmap {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	
	@JoinColumn(name="idusuario", referencedColumnName="id") @ManyToOne
	private Usuario idusuario;
	
	@JoinColumn(name="idemap", referencedColumnName="id") @ManyToOne
	private Emap idemap;
		
	@JoinColumn(name="idtarefa", referencedColumnName="id") @ManyToOne	
	private Tarefa idtarefa;
	
	private String valor;
	private boolean executado;
	private Date data;
	private Time hora;
	
	// getters and setters
}

E outra de descrição das tarefas:

@Entity @Table(name="Tarefa")
public class Tarefa {
	
	@Id
	private int id;
	private String descricao;
	private String observacao;
	
	// getters and setters
}

E na minha TarefaDAO tenho a seguinte consulta:

public List<TarefaEmap> listaTarefa(Emap emap) {
				
	return this.session.createQuery(	
		"select tarefa " +
		"from TarefaEmap as tarefa " +
		"left outer join tarefa.idusuario as usuario " +
		"left outer join tarefa.idtarefa as tarefadesc " +				
		"where tarefa.idemap.id = :idemap").setLong("idemap", emap.getId()).list();
}

O que eu quero fazer é listar no meu JSP com um forEach as seguintes informações:

Data, Hora, Descrição da Tarefa e Usuário. Eu tentei fazer da seguinte maneira:

<c:forEach var="tarefa" items="${tarefas}">        				
	<tr>
		<td>${tarefa.data}</td>
		<td>${tarefa.hora}</td>
		<td>${tarefa.idtarefa.descricao}</td>
		<td>${tarefa.idusuario.nome}</td>		
	</tr>
</c:forEach>

Mas ocorre o seguinte erro:

javax.el.PropertyNotFoundException: Property 'idtarefa' not found on type emap.modelo.TarefaEmap
	javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)
	javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)
	javax.el.BeanELResolver.property(BeanELResolver.java:279)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:935)
	org.apache.jsp.ctalogevento_jsp._jspx_meth_c_005fforEach_005f0(ctalogevento_jsp.java:188)
	org.apache.jsp.ctalogevento_jsp._jspService(ctalogevento_jsp.java:94)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(ImportSupport.java:343)
	org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(ImportSupport.java:200)
	org.apache.jsp.ctamenu_jsp._jspx_meth_c_005fimport_005f1(ctamenu_jsp.java:180)
	org.apache.jsp.ctamenu_jsp._jspService(ctamenu_jsp.java:108)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(ImportSupport.java:343)
	org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(ImportSupport.java:200)
	org.apache.jsp.ctavancado_jsp._jspx_meth_c_005fimport_005f2(ctavancado_jsp.java:331)
	org.apache.jsp.ctavancado_jsp._jspx_meth_html_005fhtml_005f0(ctavancado_jsp.java:160)
	org.apache.jsp.ctavancado_jsp._jspService(ctavancado_jsp.java:72)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
	org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
	org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Alguém poderia me ajudar? Não sei o que estou fazendo de errado! Como eu faço para fazer esse tipo de consulta?

Obrigado.

‘idtarefa’ ta apontado para este campo… percebeu ?

Olá junior, obrigado pelo retorno, mas ainda não consegui visualizar o problema!
O ‘idtarefa’ está apontado para qual campo? …

Felipe,

Primeiramente uma dica:
Você está trabalhando com objetos, então o seu relacionamento você deve dar nome dos objetos e não nome dos campos do banco de dados.
Assim, ao invés de usar “Tarefa idtarefa”, seria mais elegante usar “Tarefa tarefa… Usuario usuario” e assim por diante.

Sobre o seu erro, aparentemente você está fazendo tudo correto, mas verifica se no HQL retornou informação no relacionamento TAREFA, “talvez” o problema pode estar ai, ou seja, não retornou valores na lista de Tarefas.

Jair, obrigado pela dica, vou fazer essa mudança, pois fica bem mais amigável o código e quem sabe não seja isso que esteja ferrando!
Porque até então, o relacionamento está retornando corretamente, pois eu achei uma solução não muito bonita usando scriptlet e obtive o resultado esperado!

Fiz assim:

<%
			
	javax.servlet.http.HttpSession httpSession = request.getSession();
	java.util.List<emap.modelo.TarefaEmap> tarefas = 
		(java.util.List<emap.modelo.TarefaEmap>) 
		httpSession.getAttribute("tarefas");
			
	if (!tarefas.isEmpty()) {
			
		for (emap.modelo.TarefaEmap tarefa : tarefas) {%>
		<tr>
			<td class="tabelaConteudo" align="center">
				<%=tarefa.getData()%>
			</td>
			<td class="tabelaConteudo" align="center">
				<%=tarefa.getHora()%>
			</td>
			<td class="tabelaConteudo" align="left">
				<%=tarefa.getIdTarefa().getDescricao()%>
			</td>
			<td class="tabelaConteudo" align="left">
				<%=tarefa.getIdUsuario().getNome()%>
			</td>			
		</tr>
<%		}
	}
%>

Mas este código não está muito bonito! Se eu não achar outra solução vai ficar assim mesmo! Rsrs…

Era exatamente isso mesmo o problema, simplesmente mudei o nome do atributo de ‘idtarefa’ para somente ‘tarefa’ e agora está funcionando perfeitamente!!

Obrigado pela ajuda Jair e Junior!!

Abraços…

Valeu mano Bom Trabalho !