2
respostas

Dúvida referente ao join com varias tabelas

Buenas,tenho uma classe venda e a mesma recebe vários produtos(manyToOne) e cliente (oneToMany) e gostaria de juntar tudo em um join para fazer um relatório com apenas as informações desejadas ,tentei me aventurar implementar mas deu Erro 500 no web service ,eu andei dando uma pesquisada e acredito que seja por causa que não adicionei @joinColumn mas mesmo assim não sei qual a serventia do mesmo

Entidade venda :

package entidade;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author 631520084
 */
@Entity
@XmlRootElement
public class Venda implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String dtCompra;
    @OneToMany
    private List<Produto>produtos;
    @ManyToOne
    private Cliente cliente ;

    public Venda() {
    }

    public Venda(String dtCompra, List<Produto> produtos, Cliente cliente) {
        this.dtCompra = dtCompra;
        this.produtos = produtos;
        this.cliente = cliente;
    }



    public String getDtCompra() {
        return dtCompra;
    }

    public void setDtCompra(String dtCompra) {
        this.dtCompra = dtCompra;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }

    public Cliente getCliente() {
        return cliente;
    }

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



    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Venda)) {
            return false;
        }
        Venda other = (Venda) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entidade.Venda[ id=" + id + " ]";
    }

}

Dao da venda e o join que usei que não funfou

*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package rn;

import entidade.Fornecedor;
import entidade.Produto;
import entidade.Venda;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import util.Conexao;

/**
 *
 * @author 631520084
 */
public class VendaRN {


    public Venda inserir(Venda venda) {
        Conexao con = new Conexao();
        EntityManager em = con.getEntidade();
        em.getTransaction().begin();
        for (Produto produto : venda.getProdutos()) {
            em.merge(produto);
        }
        em.merge(venda.getCliente());
        em.persist(venda);
        em.getTransaction().commit();
        em.close();
        return venda;
    }
    public List<Venda> relatorio() {
        Conexao con = new Conexao();
        EntityManager em = con.getEntidade();
        String jpql = "SELECT p.nome,c.nome, p.preco, v.dtCompra FROM Venda v JOIN v.cliente c JOIN v.produtos p";
        Query query = em.createQuery(jpql);
        List<Venda> listaVendas = query.getResultList();

        em.close();
        return (listaVendas);

    }

}

Erro

HTTP Status 500 – Internal Server Error Type Status Report

Message Internal Server Error

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Apache Tomcat/8.5.30

OBS: o método inserir funciona por isso não é problema no webservice,o join esta compilando . Desde já grato,boa noite!

2 respostas

Buenas Felipe!

Tem como colar a exception inteira pra eu ver? Tá faltando um pedaço não tá?

Repare que na sua projeção da query ( nas colunas do select ) você tem campos desconhecidos pro objeto Venda, ou seja, o JPA não consegue montar seu objeto.

Nesse caso era ideal vc fazer um DTO pra pegar essas informações, dai vc faria uma JPQL com new().

Eu posso te passar o código que tenho aqui em mente se vc quiser, por enquanto vou deixar contigo (: Se quiser o código mais detalhado me dá um toque aqui mesmo!

Abração boa sorte!

Boa noite Yuri ,tive dificuldades em achar algo relacionado ao DTO se for possível mandar o codigo pro meu email,talvez ver o mesmo consigo saciar minhas dúvidas Email: felipemachadodasilva15@gmail.com

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software