Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jpql - Hql et les fonctions d’agrégations

    24 juin 2020 à 22:07:38

    Bonjour à tous !

    C'est ma première fois de posé une question sur le forum espèrent obtenir une aide de votre part merci d'avance.

    Je suis entrain de migrer le backend de mon système de gestion commercial de php vers Java ee avec spring boot, d'un coup je me retrouve bloqué sur comment implémenté la requête suivante en JPQL - HQL : 

    SELECT 
    	produit.id, produit.designation, prix, (sum(ligne_appro.quantite) - sum(ligne_facture.quantite)) as quantite
    FROM 
    	produit
    LEFT JOIN ligne_appro ON ligne_appro.produit = produit.id
    LEFT JOIN ligne_facture ON ligne_facture.produit = produit.id;

    Cette requête fait la sélection sur la table produit qui sert de catalogue, et en même temps elle fait la jointure sur les tables ligne_appro et ligne_facture qui sont des tables de mouvent entrée/sortie des produits afin d'obtenir la quantité pour chaque produit.

    Voici le trois classe :

    package com.entities;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonManagedReference;
    import org.hibernate.annotations.Formula;
    
    import javax.persistence.*;
    import java.io.Serializable;
    import java.util.List;
    
    @Entity
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class Produit implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
        private String designation;
        /**
         * Exprimer en Unité de stockaege
         */
        @Transient
        private double quantite;
        /**
         * Prix d'achat par Unité De Stockage (uds)
         */
        private double pa;
        /**
         * Taxe sur la Valeur Ajouter
         * Exprimer en pourcentage
         * Formule : ((prix * quantite) * tva) / 100
         */
        private double tva;
        /**
         * Quantité minimal
         */
        private double seuil;
        /**
         * Unité De Stockage
         */
        private String uds;
    
        @ManyToOne
        @JoinColumn(name = "categorie")
        private Categorie categorie;
    
        @OneToMany(mappedBy = "produit", fetch = FetchType.LAZY)
        private List<UniteDeVente> uniteDeVentes;
    
        @OneToMany(mappedBy = "produit", fetch = FetchType.LAZY)
        @JsonManagedReference
        private List<Ligne> lignes;
    
        public Produit() {  }
    
        public Produit(String designation, double pa, double tva, double seuil, String uds, Categorie categorie) {
            this.designation = designation;
            this.pa = pa;
            this.tva = tva;
            this.seuil = seuil;
            this.uds = uds;
            this.categorie = categorie;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getDesignation() {
            return designation;
        }
    
        public void setDesignation(String designation) {
            this.designation = designation;
        }
    
        public double getQuantite() {
            return quantite;
        }
    
        public void setQuantite(double quantite) {
            this.quantite = quantite;
        }
    
        public double getPa() {
            return pa;
        }
    
        public void setPa(double pa) {
            this.pa = pa;
        }
    
        public double getTva() {
            return tva;
        }
    
        public void setTva(double tva) {
            this.tva = tva;
        }
    
        public double getSeuil() {
            return seuil;
        }
    
        public void setSeuil(double seuil) {
            this.seuil = seuil;
        }
    
        public String getUds() {
            return uds;
        }
    
        public void setUds(String uds) {
            this.uds = uds;
        }
    
        public Categorie getCategorie() {
            return categorie;
        }
    
        public void setCategorie(Categorie categorie) {
            this.categorie = categorie;
        }
    
        public List<UniteDeVente> getUniteDeVentes() {
            return uniteDeVentes;
        }
    
        public void setUniteDeVentes(List<UniteDeVente> uniteDeVentes) {
            this.uniteDeVentes = uniteDeVentes;
        }
    
    }
    
    package com.entities;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    
    import javax.persistence.*;
    import java.io.Serializable;
    
    @Entity
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public abstract class Ligne implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
        private double quantite;
        private double prix;
    
        @ManyToOne
        @JoinColumn(name = "produit")
        @JsonBackReference
        private Produit produit;
    
        public Ligne() {
        }
    
        public Ligne(double quantite, double prix, Produit produit) {
            this.quantite = quantite;
            this.prix = prix;
            this.produit = produit;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public double getQuantite() {
            return quantite;
        }
    
        public void setQuantite(double quantite) {
            this.quantite = quantite;
        }
    
        public double getPrix() {
            return prix;
        }
    
        public void setPrix(double prix) {
            this.prix = prix;
        }
    
        public Produit getProduit() {
            return produit;
        }
    
        public void setProduit(Produit produit) {
            this.produit = produit;
        }
    
        public double total(){
            return prix * quantite;
        }
    }
    
    package com.entities;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    
    import javax.persistence.Entity;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    
    @Entity
    public class LigneAppro extends Ligne {
    
        private static final long serialVersionUID = 1L;
    
        @ManyToOne
        @JoinColumn(name = "appro")
        @JsonBackReference
        private Appro appro;
    
        public LigneAppro() {  }
    
        public LigneAppro(double quantite, double prix, Produit produit, Appro appro) {
            super(quantite, prix, produit);
            this.appro = appro;
        }
    
        public Appro getAppro() {
            return appro;
        }
    
        public void setAppro(Appro appro) {
            this.appro = appro;
        }
    }
    package com.entities;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    
    import javax.persistence.Entity;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    
    @Entity
    public class LigneFacture extends Ligne {
    
        private static final long serialVersionUID = 1L;
    
        @ManyToOne
        @JoinColumn(name = "uvc")
        private UniteDeVente uniteDeVente;
        private double tva;
        private double remise;
        @ManyToOne
        @JoinColumn(name = "facture")
        @JsonBackReference
        private Facture facture;
    
        public LigneFacture() {  }
    
        public LigneFacture(double quantite, double prix, Produit produit, UniteDeVente uniteDeVente, double tva, double remise, Facture facture) {
            super(quantite, prix, produit);
            this.uniteDeVente = uniteDeVente;
            this.tva = tva;
            this.remise = remise;
            this.facture = facture;
        }
    
        public UniteDeVente getUniteDeVente() {
            return uniteDeVente;
        }
    
        public void setUniteDeVente(UniteDeVente uniteDeVente) {
            this.uniteDeVente = uniteDeVente;
        }
    
        public double getTva() {
            return tva;
        }
    
        public void setTva(double tva) {
            this.tva = tva;
        }
    
        public double getRemise() {
            return remise;
        }
    
        public void setRemise(double remise) {
            this.remise = remise;
        }
    
        public Facture getFacture() {
            return facture;
        }
    
        public void setFacture(Facture facture) {
            this.facture = facture;
        }
    }
    


    Je souhaite obtenir quelque chose comme ceci :

    package com.dao;
    
    import com.entities.Produit;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    
    import java.util.List;
    
    public interface ProduitRepository extends JpaRepository<Produit, Long> {
    
        /*
        @Query("select p, sum(l.quantite) as p.quantite from Produit p " +
                "join LigneAppro l ON l.produit = p " +
                "where p.id = :id")
    
         //*
        @Query("select p, sum(l.quantite) from Produit p left join fetch ")
       //*/
        @Query("select p from Produit p where p.id = :id" )
               // "join fetch Ligne l where p.id = :id")
        public Produit getSock(long id);
    
    
    }
    





    -
    Edité par tresorngolela 24 juin 2020 à 22:21:42

    • Partager sur Facebook
    • Partager sur Twitter
      25 juin 2020 à 8:42:49

      Bonjour,

      Jette un oeil à ce post :

      https://thorben-janssen.com/dto-projections/

      tu devrais y trouver ton bonheur.

      Bonne journée

      • Partager sur Facebook
      • Partager sur Twitter
        25 juin 2020 à 9:42:54

        Merci à vous 

        GeraudMonteils

        Pour le lien qui m'a permis d'avancé pour l’instant.

        A la place d'une nouvelle classe supplémentaire comme DTO j'ai du ajouter un nouveau constructeur avec les paramètres que je souhaite et que j'appel avec HQL.

        Voici le code :

        @Query("select " +
                    "new Produit(" +
                    "p.id as id, p.designation as designation, p.pa as pa, " +
                    "(sum(coalesce(e.quantite, 0)) - sum(coalesce(s.quantite, 0))) as quantite, " +
                    " c) " +
                    "from Produit p " +
                    "join fetch Categorie c ON p.categorie = c.id " +
                    "left join LigneAppro e ON e.produit = p.id " +
                    "left join LigneFacture s ON s.produit = p.id " +
                    "where p.id = :id ")
            public Produit getSock(@Param("id") long id);



        GeraudMonteils a écrit:

        Bonjour,

        Jette un oeil à ce post :

        https://thorben-janssen.com/dto-projections/

        tu devrais y trouver ton bonheur.

        Bonne journée

        -
        Edité par tresorngolela 25 juin 2020 à 16:45:35

        • Partager sur Facebook
        • Partager sur Twitter

        Jpql - Hql et les fonctions d’agrégations

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown