Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用下面的查询恢复产品实体?_Java_Jpa_Orm - Fatal编程技术网

Java 如何使用下面的查询恢复产品实体?

Java 如何使用下面的查询恢复产品实体?,java,jpa,orm,Java,Jpa,Orm,我正在等待一个产品类型实体对象,其数量和总CAHMP包含这些值​​SUM(lc.quantity)作为quantite,SUM(lc.montant)作为total,但是我得到了一个java.lang.object类型的对象 这是我的问题 @NamedQuery(name = "Produit.findAllBuyPorductGroupByProduct", query = "SELECT p, SUM(lc.quantite) quantite, SUM(lc.montant) total

我正在等待一个产品类型实体对象,其数量和总CAHMP包含这些值​​SUM(lc.quantity)作为quantite,SUM(lc.montant)作为total,但是我得到了一个java.lang.object类型的对象

这是我的问题

@NamedQuery(name = "Produit.findAllBuyPorductGroupByProduct", 
query = "SELECT p, SUM(lc.quantite) quantite, SUM(lc.montant) total 
FROM LigneCommande lc JOIN lc.produit p 
GROUP BY p")
这是我的产品实体

/*
 * 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 com.instantech.stogeg.data.base.entity;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author instantech
 */
@Entity
@Table(name = "produit")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Produit.findAll", query = "SELECT p FROM Produit p")
    , @NamedQuery(name = "Produit.findById", query = "SELECT p FROM Produit p WHERE p.id = :id")
    , @NamedQuery(name = "Produit.findByReference", query = "SELECT p FROM Produit p WHERE p.reference = :reference")
    , @NamedQuery(name = "Produit.findByDesignation", query = "SELECT p FROM Produit p WHERE p.designation = :designation")
    , @NamedQuery(name = "Produit.findByStock", query = "SELECT p FROM Produit p WHERE p.stock = :stock")
    , @NamedQuery(name = "Produit.findAllBuyPorductGroupByProduct", query = "SELECT p, SUM(lc.quantite) quantite, SUM(lc.montant) total FROM LigneCommande lc JOIN lc.produit p GROUP BY p")
    , @NamedQuery(name = "Produit.findBy_", query = "SELECT p FROM Produit p WHERE CAST(p.id as CHAR) LIKE :numeroProduit OR CAST(p.pu as CHAR) LIKE :pu OR CAST(p.stock as CHAR) LIKE :stock OR p.reference LIKE :reference OR p.designation LIKE :designation ORDER BY p.designation")
    , @NamedQuery(name = "Produit.findByPu", query = "SELECT p FROM Produit p WHERE p.pu = :pu")
    , @NamedQuery(name = "Produit.findByDate", query = "SELECT p FROM Produit p WHERE p.date = :date")
    , @NamedQuery(name = "Produit.findByHeure", query = "SELECT p FROM Produit p WHERE p.heure = :heure")})
public class Produit implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "reference")
    private String reference;
    @Basic(optional = false)
    @Column(name = "designation")
    private String designation;
    @Basic(optional = false)
    @Column(name = "stock")
    private int stock;
    @Basic(optional = false)
    @Column(name = "pu")
    private float pu;
    @Basic(optional = false)
    @Column(name = "date")
    @Temporal(TemporalType.DATE)
    private Date date;
    @Basic(optional = false)
    @Column(name = "heure")
    @Temporal(TemporalType.TIME)
    private Date heure;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "produit")
    private Collection<LigneCommande> ligneCommandeCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "produit")
    private Collection<HistoryStock> historyStockCollection;

    @Transient
    private int quantite;
    @Transient
    private double total;

    public Produit() {
    }

    public Produit(Integer id) {
        this.id = id;
    }

    public Produit(Integer id, String reference, String designation, int stock, float pu, Date date, Date heure) {
        this.id = id;
        this.reference = reference;
        this.designation = designation;
        this.stock = stock;
        this.pu = pu;
        this.date = date;
        this.heure = heure;
    }

    public Integer getId() {
        return id;
    }

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

    public String getReference() {
        return reference;
    }

    public void setReference(String reference) {
        this.reference = reference;
    }

    public String getDesignation() {
        return designation;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

    public int getStock() {
        return stock;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public float getPu() {
        return pu;
    }

    public void setPu(float pu) {
        this.pu = pu;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Date getHeure() {
        return heure;
    }

    public void setHeure(Date heure) {
        this.heure = heure;
    }

    @XmlTransient
    public Collection<LigneCommande> getLigneCommandeCollection() {
        return ligneCommandeCollection;
    }

    public void setLigneCommandeCollection(Collection<LigneCommande> ligneCommandeCollection) {
        this.ligneCommandeCollection = ligneCommandeCollection;
    }

    @XmlTransient
    public Collection<HistoryStock> getHistoryStockCollection() {
        return historyStockCollection;
    }

    public void setHistoryStockCollection(Collection<HistoryStock> historyStockCollection) {
        this.historyStockCollection = historyStockCollection;
    }

    @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 Produit)) {
            return false;
        }
        Produit other = (Produit) object;
        return !((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id)));
    }

    @Override
    public String toString() {
        return this.getDesignation() + " ( "+this.getStock()+ " ) ";
    }

    public Object[] getProduit(){
        return new Object [] {
            this.getId(), this.getReference(), this.getDesignation(), this.getStock(), this.getPu()
        };
    }

    public int updateStock(int quantite) throws Exception{
        if(quantite > this.getStock())
            throw new Exception("Le stock du produit est inférieur à la quantité commandé");
        else
            return (this.getStock() -  quantite);
    }

    public int adQuantity(int quantite) throws Exception{
        if(quantite > 0){
          return (this.getStock() + quantite);  
        }else{
            throw new Exception("Le stock du produit est ne peut pas être null ou négatif");
        }

    }

    public int getQuantite() {
        return quantite;
    }

    public void setQuantite(int quantite) {
        this.quantite = quantite;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

}
这是执行后的结果

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.instantech.stogeg.data.base.entity.Produit
    at java.util.Vector.forEach(Vector.java:1275)
    at test.main(test.java:22)
注意:在数据库中的“我的产品”表中,我的产品实体中的“数量”和“总数”字段不存在。

1)创建某种类型的a以:

public class ResultDTO{

   private Product product;
   private Integer quantity;
   private Double total;

   public ResultDTO(Product product, Integer quantity, Double total){
      // set fields
   }
2)更改查询以使用该类:

@NamedQuery(name = "Produit.findAllBuyPorductGroupByProduct", 
query = "SELECT new com.mypackage.ResultDTO(
                p as product, SUM(lc.quantite) as quantity, SUM(lc.montant) as total) 
FROM LigneCommande lc JOIN lc.produit p 
GROUP BY p")
3)将泛型类型更改为ResultDTO:

public List<ResultDTO> findProductGroupBy() {
        TypedQuery<ResultDTO> query = this.getEntitymanager().createNamedQuery(
            "Produit.findAllBuyPorductGroupByProduct", ResultDTO.class);
        return query.getResultList();
    }
公共列表findProductGroupBy(){
TypedQuery query=this.getEntitymanager().createNamedQuery(
“Produit.findallbuyProductGroupByProduct”,resultTo.class);
返回query.getResultList();
}

您正在寻找的是投影。如何使用它们被非常彻底地解释了一遍。它们比自定义对象(通过new关键字)工作得更好,因为它们支持本机查询,并且通常更容易理解

步骤1:声明一个简单的bean数据传输对象(dto)

步骤2:在存储库中创建自定义spring数据查询

@Query(“从LigneCommande lc中选择p产品、总和(lc.quantite)数量、总和(lc.montant)总计通过p加入lc.produit p组”)
列出getProductSummaries();

好的,好的,我正在尝试。请注意,我在本例中使用了Lombok。但不要害怕,它只生成getter、setter、equals、hashcode、empty和all-args构造函数。
public class ResultDTO{

   private Product product;
   private Integer quantity;
   private Double total;

   public ResultDTO(Product product, Integer quantity, Double total){
      // set fields
   }
@NamedQuery(name = "Produit.findAllBuyPorductGroupByProduct", 
query = "SELECT new com.mypackage.ResultDTO(
                p as product, SUM(lc.quantite) as quantity, SUM(lc.montant) as total) 
FROM LigneCommande lc JOIN lc.produit p 
GROUP BY p")
public List<ResultDTO> findProductGroupBy() {
        TypedQuery<ResultDTO> query = this.getEntitymanager().createNamedQuery(
            "Produit.findAllBuyPorductGroupByProduct", ResultDTO.class);
        return query.getResultList();
    }
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductSummaryDto {
     private Product product;
     private Integer quantity;
     private Double total;
}
@Query("SELECT p product, SUM(lc.quantite) quantity, SUM(lc.montant) total FROM LigneCommande lc JOIN lc.produit p GROUP BY p")
List<ProductSummaryDto> getProductSummaries();