2011-05-17 51 views
0

我想使用下面的代码运行一个mysql sql语句;insertupdate sql mysql和jpa实体

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:无法执行本地批量操作查询

回答

0

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

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。

+0

我想检查记录与给定的“CenterId”和“ProductId”,如果它存在给定的数据应该更新,如果没有插入。 在这种情况下,我认为我应该改变喜欢的地方“不存在(...” – 2011-05-17 16:46:40

+0

我编辑了我的答案以反映您的需求。是否有理由不使用您的JPA实现方法来执行此操作?IE Hibernate saveOrUpdate()方法 – Marcelo 2011-05-17 16:54:22

+0

这是一个带有产品价格信息的交叉引用表,我没有全部记录的主键 – 2011-05-17 17:04:15

0

感谢您的关注马塞洛,我做了一种蹩脚的方式。

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