Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 通用标准更新集布尔=!布尔值_Spring Boot_Spring Data Jpa_Criteria_Criteria Api - Fatal编程技术网

Spring boot 通用标准更新集布尔=!布尔值

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

我想使用criteriaUpdate创建如下更新查询:

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)”可能会工作,但我不知道如何做……没问题。而且这个规范似乎只在有其他谓词的情况下才用于追加。可能是错误的方言?