IllegalArgumentException:参数valuefunction.AggregationFunction与期望类型[java.lang.Long(n / a)]

时间:2018-03-09 09:14:49

标签: java postgresql hibernate hibernate-criteria

我想通过条件构建器增加变量。我写了以下代码

    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)]

不匹配

如何解决我的问题?

1 个答案:

答案 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));