2017-04-10 12 views
-1

我已经在其他地方搜索它,但我无法找到解决方案,解决了我的问题,我试图将JPQL查询和列中的所有输入求和和在一个名为total的列中提交并在插入后将此结果显示在一个JTextField中,我用不同的方式尝试过,但没有人给出正确的答案。这里是我的决心:Sum列值和保存在数据库JPA

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; 
    }  } 

Pedido类:

@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; 
    } } 

它给了我这个错误主要类测试它:

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 fo执行RM它给了我一个堆栈跟踪(毕竟,哪个对象上缺少呢??):

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) 

我已经尝试过申报与列表回报retornaSoma()函数,并把它在插入时,该功能已执行但未提交。

enter image description here

+1

1)请使用**代码格式**(不是右侧按钮中可用的HTML/CSS/JS代码片段的格式),以获取代码和代码片段,结构化文档(如XML或输入/输出)。为此,请选择文本,然后单击邮件发布/编辑窗体顶部的** {}'按钮**。 2)请[编辑]问题来纠正这一问题。 –

+1

您的实体被命名为Pedido,而不是Pedido。类名在JPQL中也是区分大小写的。 –

+0

@JBNizet我已经把'Query q = cf.createEm()。createQuery(“SELECT sum(valorTotal)from Pedido”);'和'Double','float'我决定让'双'。现在唯一的问题是,我无法从这个函数中获取值并将其放在总变量中,但它没有记录该值(在调试后我修改了上面的解决方案) – Ito

回答

0

现在我已经意识到我的错误:

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; 
 
    }

Pedido:

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

 

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

最后工作!非常感谢!