【问题标题】:insertupdate sql mysql and jpa entityinsertupdate sql mysql 和 jpa 实体
【发布时间】:2011-08-27 09:40:12
【问题描述】:

我正在尝试使用下面的代码运行 mysql sql 语句;

public void createUpdate(Tsaleline entity) {
    //Insert
    String sql = "Insert into tSaleLine (CenterId, ProductId, Price, VATRate) "
            + "Select :centerId, :productId, :price, :vatrate "
            + "where (Select count(*) from tSaleLine where CenterId = :centerId and ProductId = :productId)=0; "
            //Update
            + "Update tSaleLine "
            + "set CenterId = :centerId, "
            + "ProductId = :productId, "
            + "Price = :price, "
            + "VATRate = :vatrate "
            + "where CenterId = :centerId and ProductId = :productId; ";

    Query q = getEntityManager().createNativeQuery(sql);

            q.setParameter("centerId", entity.getCenterId())
            .setParameter("productId", entity.getProductId())
            .setParameter("price", entity.getPrice())
            .setParameter("vatrate", entity.getVATRate())
            .executeUpdate();
}

}

但它会出现错误:

异常

org.apache.jasper.JasperException: javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: 无法执行本机批量操作查询

【问题讨论】:

    标签: java mysql jboss entity


    【解决方案1】:

    这只会在记录不存在时插入。之后它将更新指定记录的价格和增值税。

    public void createUpdate(Tsaleline entity) {
        //Insert
        String sql = "Insert into tSaleLine (CenterId, ProductId, Price, VATRate) "
                + "Select :centerId, :productId, :price, :vatrate "
                + "where not exists (Select * from tSaleLine where CenterId = :centerId and ProductId = :productId); "
                //Update
                + "Update tSaleLine "
                + "set Price = :price, "
                + "VATRate = :vatrate "
                + "where CenterId = :centerId and ProductId = :productId; ";
    
        Query q = getEntityManager().createNativeQuery(sql);
    
                q.setParameter("centerId", entity.getCenterId())
                .setParameter("productId", entity.getProductId())
                .setParameter("price", entity.getPrice())
                .setParameter("vatrate", entity.getVATRate())
                .executeUpdate();
    }
    

    这不是理想的解决方案,因为您使用的 JPA 实现应该负责对实体的 INSERT 或 UPDATE。

    【讨论】:

    • 我正在尝试检查具有给定“CenterId”和“ProductId”的记录,如果它存在,则如果未插入数据,则应更新。在那种情况下,我认为我应该更改“不存在(...”)之类的位置
    • 我编辑了我的答案以反映您的需求。您是否有理由不使用 JPA 实现的方法来执行此操作? IE。休眠 saveOrUpdate() 方法。
    • 嗯,这是一个包含产品价格信息的交叉引用表,我没有所有记录的主键。
    • 不...我更改了 sql 它是相同的。你能看到任何语法错误吗?或者你知道关于这种情况的任何解决方法吗?
    • 您能否发布一份堆栈跟踪副本以查看完整的错误详情?
    【解决方案2】:

    感谢您对 Marcelo 的关注,我做的有点蹩脚。

                entity.Tsaleline saleline = sf.findByProductIdCenterId(Integer.parseInt(productIds[i]), Integer.parseInt(centerIds[i]));
                if (saleline != null)
                {
                    saleline.setPrice(Float.parseFloat(price[i]));
                    saleline.setVATRate(Float.parseFloat(vat[i]));
                    sf.edit(saleline);
                }
                else
                {
                    saleline = new entity.Tsaleline(Integer.parseInt(productIds[i]), Integer.parseInt(centerIds[i]), Float.parseFloat(price[i]), Float.parseFloat(vat[i]));
                    sf.create(saleline);
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-25
      • 2010-10-31
      • 1970-01-01
      • 2018-12-02
      • 2013-12-10
      • 2012-06-23
      • 2022-01-04
      • 2015-10-02
      相关资源
      最近更新 更多