Ошибка построителя критериев во время запроса на обновление: BinaryArithmeticOperation не соответствует ожидаемому типу - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь выполнить следующий 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). Та же проблема все еще.

Чего мне не хватает?

1 Ответ

0 голосов
/ 24 января 2019

Вы должны указать, что атрибут пути ссылается на Long:

update.set((Path<?>) root.<Long>get("balance"), cb.sum(root.<Long>get("balance"), amount));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...