【发布时间】:2018-11-10 16:36:01
【问题描述】:
我想使用条件更新来创建这样的更新查询:
UPDATE <SOME TABLE>
SET SELECTED = !SELECTED
WHERE
[DYNAMIC QUERY HERE]
我能得到的最接近的是代码:
public <T> Query createRevertSelectionQuery(Class<T> clazz, EntityManager em, Specification<T> s) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<T> criteriaUpdate = cb.createCriteriaUpdate(clazz);
Root<T> root = criteriaUpdate.from(clazz);
Predicate p = cb.and(new Predicate[] {s.toPredicate(root, null, cb)});
Expression<Boolean> e =cb.not((root.get("selected").as(Boolean.class)));
Path<Boolean> selected = root.get("selected");
criteriaUpdate.set(selected, e);
criteriaUpdate.where(p);
Query q = em.createQuery(criteriaUpdate);
return q;
}
但它失败了,因为我收到以下查询:
update com.redknee.suspense.mgt.model.Moc as generatedAlias0
set generatedAlias0.selected = generatedAlias0.selected <> true
where
[dynamic query]
给我错误
org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:在第 1 行,第 118 列附近
有人可以帮忙吗?
【问题讨论】:
-
看起来像弹簧,弹簧靴?添加相关标签以询问是否是。规格如何?
-
谢谢@pirho。规范如下:我想使用“规范 s”中指定的 where 子句更新通用实体 T 设置列“selected”=“NOT(selected)”如果我可以设置“set generatedAlias0.selected = (generatedAlias0. selected true)" 可能会起作用,但我不知道该怎么做...
-
没有问题。如果有其他谓词,规范似乎只用于附加。
-
方言可能有误?
标签: spring-boot spring-data-jpa criteria criteria-api