insertupdate sql mysql и jpa entity - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь выполнить SQLQ-оператор MySQL, используя приведенный ниже код:

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: не удалось выполнить собственный запрос массовой манипуляции

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Спасибо за ваш интерес, Марсело, я сделал это как-то неубедительно.

            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);
            }
0 голосов
/ 17 мая 2011

Будет вставлено, только если запись не существует. После этого он обновит цену и vatrate для указанной записи.

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 для объекта.

...