【问题标题】:Sum column values and save at the database in JPA对列值求和并保存在 JPA 中的数据库中
【发布时间】:2017-04-10 01:53:05
【问题描述】:

我到处搜索,但找不到解决问题的解决方案,我正在尝试使用 JPQL 查询将该列中的所有输入求和并在名为 total 的列中提交并在插入后在 JTextField 中显示此结果,我以不同的方式尝试了它,但没有人给出好的结果。这是我的解决方案:

public class ViewPedidos extends javax.swing.JInternalFrame {

private DAOManager manager;
private PedidoModel model;
private MySQLPedidoDAO mspdao;
private MySQLClienteDAO mscdao;
private MySQLProdutoDAO msprdao;
private List<Produto> produtos;
private List<Pedido> pedidos;
private Pedido ped;
private Produto pro;
private boolean editavel;


public void inserirDados(Pedido ped) {
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date date = new Date();
        System.out.println(dateFormat.format(date));

        { JTextField sets ...} 

        /*LINE GIVING THE ERROR UNDER!!! */
        //float soma = mspdao.retornaSoma();
        Double soma = mspdao.retornaSoma();
        ped.setTotal(soma);
    }  }

MySQLPedidoDAO 类:

public class MySQLPedidoDAO implements PedidoDAO {

    public ConnectionFactory cf;


    public MySQLPedidoDAO(ConnectionFactory cf) {
        this.cf = cf;
    }

    /*
    @Override
    public float retornaSoma(){
       cf.createEm().getTransaction().begin();
       Query q = cf.createEm().createQuery("SELECT sum(valorTotal) from pedido");
       float soma = (float) q.getSingleResult();
       cf.createEm().getTransaction().commit();
       cf.close();
       return soma;
    }*/

    public Double retornaSoma(){
       cf.createEm().getTransaction().begin();
       Query q = cf.createEm().createQuery("SELECT sum(valorTotal) from pedido");
       Double soma = (float) q.getSingleResult();
       cf.createEm().getTransaction().commit();
       cf.close();
       return soma;
    }      }

小儿科:

@Entity
@Table(name = "pedido")
public class Pedido implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCadastro;
    @Column
    private String nomeProduto;
    @Column
    private int numControle;
    @Column
    private int quantidade;
    @Column(precision=15, scale=7)
    private float valorUnitario;
    @Column
    private Integer codCliente;
    @Column(precision=15, scale=7)
    private float valorTotal;
    @Column
    //private float total;
    private Double total;


    public Pedido() {
    }


    public Pedido(int numControle, Date dataCadastro, String nomeProduto, float valorUnitario, float valorTotal, int quantidade, int codCliente){
        this.numControle = numControle;
        this.dataCadastro = dataCadastro;
        this.nomeProduto = nomeProduto;
        this.valorUnitario = valorUnitario;
        this.valorTotal = valorTotal;
        this.quantidade = quantidade;
        this.codCliente = codCliente;
    }

    { getters and setters }



    @Override
    public String toString() {
        return "Pedido" + "id=" + id + ", dataCadastro=" + dataCadastro + ", nomeProduto=" + nomeProduto + ", numControle=" + numControle + ", quantidade=" + quantidade + ", valorUnitario=" + valorUnitario + ", codCliente=" + codCliente + ", valorTotal=" + valorTotal + ", total=" + getTotal() + '\n';
    }

    /**
     * @return the total
     */
    public float getTotal() {
        return total;
    }

    /**
     * @param total the total to set
     */
    public void setTotal(float total) {
        this.total = total;
    }  }

用 Main 类测试它给了我这个错误:

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: pedido is not mapped [SELECT sum(valorTotal) from pedido]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:331)
    at com.exemplo.repositorio.MySQLPedidoDAO.retornaSoma(MySQLPedidoDAO.java:115)
    at com.exemplo.main.Main.retornaSoma(Main.java:117)
    at com.exemplo.main.Main.main(Main.java:35)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: pedido is not mapped [SELECT sum(valorTotal) from pedido]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1796)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)
    ... 3 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: pedido is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189)
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109)
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:331)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3633)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3522)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
    ... 11 more

并在 ViewPedidos 表单中执行它给了我另一个 StackTrace(毕竟,它上面缺少哪个对象??):

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.exemplo.view.ViewPedidos.inserirDados(ViewPedidos.java:580)
    at com.exemplo.view.ViewPedidos.btInserirActionPerformed(ViewPedidos.java:406)
    at com.exemplo.view.ViewPedidos.access$400(ViewPedidos.java:46)
    at com.exemplo.view.ViewPedidos$5.actionPerformed(ViewPedidos.java:283)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6533)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我已经尝试用 List return 声明 retornaSoma() 函数并将其放在插入事件中,该函数已执行但未提交。

enter image description here

【问题讨论】:

  • 1) 请使用 代码格式(不是右侧两个按钮中可用的 HTML/CSS/JS sn-p 格式)作为代码和代码 sn- ps,结构化文档,如 XML 或输入/输出。为此,请选择文本并单击消息发布/编辑表单顶部的 {} 按钮。 2)请edit问题更正此问题。
  • 您的实体名为 Pedido,而不是 pedido。 JPQL 中的类名也是区分大小写的。
  • @JBNizet 我把Query q = cf.createEm().createQuery("SELECT sum(valorTotal) from Pedido");Double 的返回值放在float 中,它总是给出转换错误,所以我决定让Double。现在唯一的问题是我无法从此函数中获取值并将其放在总变量中,但它没有记录该值(我在调试检查后修改了上面的解决方案)

标签: java mysql swing hibernate jpa


【解决方案1】:

现在我意识到了我的错误:

MySQLPedidoDAO:

@Override
    public Double retornaSoma(){
       cf.createEm().getTransaction().begin();
       //Line corrected
       Query q = cf.createEm().createQuery("select sum(valorTotal) from Pedido");
       Double soma = (Double) q.getSingleResult();
       cf.createEm().getTransaction().commit();
       cf.close();
       return soma;
    }

佩多:

    /**
     * @return the total
     */
    //Instead float
    public Double getTotal() {
        return total;
    }


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

终于开工了!非常感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2019-11-05
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多