HIBERNATE - Selecionar campos retornados na consulta

3 respostas
eloimendes

Olá!

Tenho 3 tabelas:

Cliente: id_cliente, nome
Produto: id_produto, descricao, valor, qtd
Compra: id_compra, id_cliente, id_produto, qtd

Os campos id_cliente e id_produto na tabela Compra referenciam a tabela Cliente e Produto respectivamente.

Quero exibir uma página listando todas as compras, contendo o id_compra, nome do cliente, nome do produto e a quantidade.

Mapeamento do Cliente
@Entity
public class Cliente implements java.io.Serializable {
    
    //Chave primária    
    private Long id_cliente;  

    private String nome;

    private Set compras = new HashSet();
    
    /** Creates a new instance of Cliente */
    public Cliente() {
    }
    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId_cliente() {
        return id_cliente;
    }

    public void setId_cliente(Long id_cliente) {
        this.id_cliente = id_cliente;
    }

    @NotNull
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    
    @OneToMany(mappedBy="cliente")
    public Set<Compra> getCompras() {
        return compras;
    }

    public void setCompras(Set<Compra> compras) {
        this.compras = compras;
    }
}
Mapeamento do Produto:
@Entity
public class Produto implements java.io.Serializable {
    
    //Chave primária    
    private Long id_produto;  

    private String descricao;
    private float valor;
    private int qtd;    

    private Set compras = new HashSet();
    
    /** Creates a new instance of Produto */
    public Produto() {
    }

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId_produto() {
        return id_produto;
    }

    public void setId_produto(Long id_produto) {
        this.id_produto = id_produto;
    }

    @NotNull
    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @NotNull
    public float getValor() {
        return valor;
    }

    public void setValor(float valor) {
        this.valor = valor;
    }

    @NotNull
    public int getQtd() {
        return qtd;
    }

    public void setQtd(int qtd) {
        this.qtd = qtd;
    }   

    @OneToMany(mappedBy="produto")
    public Set<Compra> getCompras() {
        return compras;
    }

    public void setCompras(Set<Compra> compras) {
        this.compras = compras;
    }
}
Mapeamento da Compra
@Entity
public class Compra implements java.io.Serializable {
    
    //Chave primária
    private Long id_compra;   

    private int qtd;

    private Cliente cliente;
    private Produto produto;
    
    /** Creates a new instance of Compra */
    public Compra() {
    }

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId_compra() {
        return id_compra;
    }

    public void setId_compra(Long id_compra) {
        this.id_compra = id_compra;
    }

    @ManyToOne(optional=false)    
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    @ManyToOne(optional=false)    
    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    @NotNull
    public int getQtd() {
        return qtd;
    }

    public void setQtd(int qtd) {
        this.qtd = qtd;
    }    
}
Esta é a página.
<%
BdCompra bdCompra = new BdCompra();
List compras = bdCompra.exibir();
if(compras!=null){
%>
<table border="1">
<tr>
    <th>ID_COMPRA</th>
    <th>CLIENTE</th>
    <th>PRODUTO</th>
    <th>QUANTIDADE</th>
</tr>
<%
for(int i=0; i<compras.size(); i++){
    Compra compra = (Compra)compras.get(i);
%>
<tr>
<td><%=compra.getId_compra()%></td>
<td><%=compra.getCliente().getNome()%></td>
<td><%=compra.getProduto().getDescricao()%></td>
<td><%=compra.getQtd()%></td>
</tr>
<%
}
%>
</table>
Função Exibir
public List exibir(){
	try{
	    Session session = HibernateUtil.getSession();
	    return session.createQuery("from Compra").list();    
	}catch(Exception e){
	    return null;
	}
}

Utilizando a função acima funcionou corretamente, porém todos os campos do cliente e produto são carregados. Eu gostaria de diminuir esta carga para que carregasse apenas os campos id_compra, nome do cliente, descricao do produto e a quantidade comprada.

Já tentei assim:
public List exibir(){
	try{
	    Session session = HibernateUtil.getSession();	    
	    return session.createQuery(
		    "select com.id_compra, com.qtd, com.cliente.nome, com.produto.descricao " +
		    "from Compra com")
		    .list();
	}catch(Exception e){
	    return null;
	}
}
Porém, o seguinte erro é retornado:
org.apache.jasper.JasperException: Exception in JSP: /etc.jsp:154

151:                 </tr>
152:             <%
153:                 for(int i=0; i<compras.size(); i++){
154:                     Compra compra = (Compra)compras.get(i);
155:             %>
156:             <tr>
157:                 <td><%=compra.getId_compra()%></td>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

root cause

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to modelo.Compra
	org.apache.jsp.etc_jsp._jspService(etc_jsp.java:266)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368

Alguém sabe o que e porque está errado???

Desde já obrigado!

3 Respostas

gilliard_santos

O que deve estar acontecendo é que você está tratando o resultado como uma List de Compra, e isso nao é verdade… como você fez um select especificando os campos que devem ser retornados, o hibernate vai te devolver uma List de Object[] onde cada Object diz respeito a um campo do seu select.
Espero ter ajudado :wink:

eloimendes

Não é possível retornar uma List de Compra do jeito que eu quero?

eloimendes

Eu gostaria de retornar uma Lista do tipo Compra, porém com apenas os campos que eu quero.

Criado 7 de fevereiro de 2007
Ultima resposta 7 de fev. de 2007
Respostas 3
Participantes 2