Я пытаюсь выполнить следующий SQL с помощью построителя критериев гибернации:
update account set balance = balance + 500;
Вот мой код построения запроса:
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaUpdate<JBCAccount> update = cb.createCriteriaUpdate(JBCAccount.class);
Root root = update.from(JBCAccount.class);
update.set("balance", cb.sum(root.get("balance"), amount));
getEntityManager().createQuery(update).executeUpdate();
Также я пробовал:
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaUpdate<JBCAccount> update = cb.createCriteriaUpdate(JBCAccount.class);
Root root = update.from(JBCAccount.class);
ParameterExpression<Long> amountExpression = cb.parameter(Long.class);
update.set("balance", cb.sum(root.get("balance"), amountExpression));
getEntityManager().createQuery(update)
.setParameter(amountExpression, amount).executeUpdate();
Оба выполнения приводят к следующей ошибке:
org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [org.hibernate.query.criteria.internal.expression.BinaryArithmeticOperation@53e0be2d] did not match expected type [java.lang.Long (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [org.hibernate.query.criteria.internal.expression.BinaryArithmeticOperation@53e0be2d] did not match expected type [java.lang.Long (n/a)]] with root cause
"java.lang.IllegalArgumentException: Parameter value [org.hibernate.query.criteria.internal.expression.BinaryArithmeticOperation@53e0be2d] did not match expected type [java.lang.Long (n/a)]
Тип баланса в базе данных MySQL: balance bigint UNSIGNED
.
amount
переменная в коде имеет тип Long
.
balance
свойство JBCAccount
равно Long
.
Я также пытался воссоздать схему MySQL с balance bigint
(т.е. без UNSIGNED
). Та же проблема все еще.
Чего мне не хватает?