Spring boot 通用标准更新集布尔=!布尔值
我想使用criteriaUpdate创建如下更新查询:Spring boot 通用标准更新集布尔=!布尔值,spring-boot,spring-data-jpa,criteria,criteria-api,Spring Boot,Spring Data Jpa,Criteria,Criteria Api,我想使用criteriaUpdate创建如下更新查询: UPDATE <SOME TABLE> SET SELECTED = !SELECTED WHERE [DYNAMIC QUERY HERE] 更新 设置选定项=!挑选出来的 哪里 [此处动态查询] 我能得到的最接近的是代码: public <T> Query createRevertSelectionQuery(Class<T> clazz, EntityManager em, Specificat
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;
}
public Query createRevertSelectionQuery(类clazz,EntityManager em,规范s){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaUpdate-CriteriaUpdate=cb.createCriteriaUpdate(clazz);
Root=criteriaUpdate.from(clazz);
谓词p=cb.and(新谓词[]{s.toPredicate(root,null,cb)});
表达式e=cb.not((root.get(“selected”).as(Boolean.class));
所选路径=root.get(“所选”);
criteriaUpdate.set(选中,e);
标准更新。其中(p);
Query q=em.createQuery(criteriaUpdate);
返回q;
}
但它失败了,因为我得到了以下查询:
update com.redknee.suspense.mgt.model.Moc as generatedAlias0
set generatedAlias0.selected = generatedAlias0.selected <> true
where
[dynamic query]
将com.redknee.suspence.mgt.model.Moc更新为generatedAlias0
将generatedAlias0.selected设置为generatedAlias0.selected true
哪里
[动态查询]
告诉我错误
org.hibernate.hql.internal.ast.QuerySyntaxException:意外标记:第118列第1行附近
任何人都可以帮忙吗?我不确定这是一个bug,还是不打算这样使用 在where子句中,NOT和任何其他操作数都像一个符咒一样工作。但是,无论您尝试什么,HibernateQueryBuilder似乎总是在优化那些括号(在我看来,总是使用括号可能仍然是一个好习惯,但这只是一种意见) 强制使用括号的一种方法是使用JPA
子查询
。参见下面的示例。请注意,我根据自己的喜好略微更改了JPA对象名称,并且没有包括规范
,因为它与此解决方案无关:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<T> update = cb.createCriteriaUpdate(clazz);
Root<T> from = update.from(clazz);
Path<Boolean> selected = from.get("selected");
// Subquery just "joins back" to the same row and
// returns a negated boolean value of "selected" from the original row
Subquery<Boolean> subSelect = update.subquery(Boolean.class);
Root<T> subFrom = subSelect.from(clazz);
subSelect.select(cb.not(selected));
subSelect.where(cb.equal(from.get("id"), subFrom.get("id")));
update.set(selected, subSelect);
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaUpdate=cb.createCriteriaUpdate(clazz);
Root-from=update.from(clazz);
所选路径=from.get(“所选”);
//子查询只是“连接回”同一行和
//从原始行返回一个否定的布尔值“selected”
Subquery subSelect=update.Subquery(Boolean.class);
Root subFrom=子选择自(clazz);
子选择选择(cb.not(selected));
其中(cb.equal(from.get(“id”)、subFrom.get(“id”)));
更新.set(已选择,再选择);
看起来像弹簧,弹簧靴?如果是问题,则在问题中添加相关标签。规格如何?谢谢@pirho。规范如下:我想用“规范s”中指定的where子句更新通用实体T,设置列“selected”=“NOT(selected)”,如果我可以设置“set generatedAlias0.selected=(generatedAlias0.selected true)”可能会工作,但我不知道如何做……没问题。而且这个规范似乎只在有其他谓词的情况下才用于追加。可能是错误的方言?