JPA make a join of a table that has attribute @manyToOne and @ManyToMany

3

I am having a question regarding table joins, I have a sales class the same as Customer, Buy, ProductList. I would like to make a report with product name, customer name, product value and date of purchase only I do not have the slightest idea how to do it because of the annotation of @ManyToMany that creates a broker table. Entity For Sale

 @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 + " ]";
    }

}

Product Entity:

    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.ManyToMany;
import javax.persistence.ManyToOne;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author 631520084
 */

    @Entity
    @XmlRootElement
    public class Produto implements Serializable {

        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        private Long id;
        private float preco;
        private String nome;
        @ManyToMany
        private List<Fornecedor> fornecedor;
        @ManyToOne
        private Categoria categoria;

        public Produto(float preco, String nome,  List<Fornecedor> fornecedor, Categoria categoria) {
            this.preco = preco;
            this.nome = nome;

            this.fornecedor = fornecedor;
            this.categoria = categoria;
        }

        public Produto() {
        }


        public float getPreco() {
            return preco;
        }

        public void setPreco(float preco) {
            this.preco = preco;
        }

        public String getNome() {
            return nome;
        }

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



        public List<Fornecedor> getFornecedor() {
            return fornecedor;
        }

        public void setFornecedor(List<Fornecedor> fornecedor) {
            this.fornecedor = fornecedor;
        }

        public Categoria getCategoria() {
            return categoria;
        }

        public void setCategoria(Categoria categoria) {
            this.categoria = categoria;
        }




        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 Produto)) {
                return false;
            }
            Produto other = (Produto) 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.Produto[ id=" + id + " ]";
        }

    }

Business layer of the sale (Where will the join)

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 List<Venda> imprimir() {
        Conexao con = new Conexao();
        EntityManager em = con.getEntidade();
        String jpql = "Select venda from Venda venda ";
        Query query = em.createQuery(jpql);
        List<Venda> listaVendas = query.getResultList();

        em.close();
        return (listaVendas);

    }

    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;
    }
}
    
asked by anonymous 27.04.2018 / 19:23

1 answer

3

You did not post the client entity code, so I assumed that the client name is in the nome field. Here's what JPQL looks like in this case:

SELECT p.nome, c.nome, p.preco, v.dtCompra FROM Venda v
JOIN v.cliente c
JOIN v.produtos p

You may need to group some of the information, but I think this is another question.

    
27.04.2018 / 20:57