我想通过条件构建器增加变量。我写了以下代码
final CriteriaBuilder cb= getCriteriaBuilder();
final CriteriaUpdate<MyEntity> update = cb.createCriteriaUpdate(MyEntity.class);
final Root<MyEntity> root = update.from(MyEntity.class);
update.set("field", cb.sum(criteriaBuilder.<Long>sum(root.get("field"), 1L)));
update.where(cb.equal(root.get("id"), id));
final Query query = getEntityManager().createQuery(update);
query.executeUpdate();
myEntity所:
@Table(name ="myEntity")
@Entity
public class MyEntity{
private String id;
private long field;
}
数据库表具有以下结构:
create table if not exists myEntity
(
field integer not null,
id varchar(32) not null,
);
但是我收到了以下错误
java.lang.IllegalArgumentException:参数值 [org.hibernate.query.criteria.internal.expression.function.AggregationFunction$SUM@46dd740b] 与预期类型[java.lang.Long(n / a)]
不匹配
如何解决我的问题?
答案 0 :(得分:2)
您的代码中存在多个错误。
首先:你选择了错误的过载。
github
而不是:
CriteriaUpdate<T> set(String attributeName, Object value);
这是因为您使用了无类型的CriteriaBuilder。解决问题的方法是将第一个参数作为<Y> CriteriaUpdate<T> set(
Path<Y> attribute,
Expression<? extends Y> value);
传递,而不是Path<Long>
。
第二: 我不确定你的查询试图完成什么,但它看起来有一个总和很多。我相信它应该是这样的:
String
将生成:
Path<Long> fieldPath = root.get("field");
update.set (fieldPath, cb.sum(root.get("field"), 1L));
update.where(cb.equal(root.get("id"), id));