基于列名的JPA更新

bybem2ql  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(129)

我想更新用户输入的特定列的值。下面是我的代码,有谁知道如何修改它以纠正错误吗?

public void updateValue(String value, String id, String ww){   
   Query q = em.createQuery("Update TableA e SET e.?1 = ?2 WHERE e.num = ?3");
   q.setParameter(1, ww); //since has many columns, user require to specific column to update
   q.setParameter(2, value);
   q.setParameter(3, id);
   q.executeUpdate();    
}
2nc8po8w

2nc8po8w1#

如果您使用的是JPA 2.1,您应该使用条件生成器查询。下面是您应该做的事情

public void updateValue(String value, String id, String ww){  
    CriteriaBuilder cb = this.em.getCriteriaBuilder();

      // create update
      CriteriaUpdate<TableAEntity> update = cb.
         createCriteriaUpdate(TableAEntity.class);

      // set the root class
      Root e = update.from(TableAEntity.class);

      // set update and where clause
      update.set(ww, value);
      update.where(cb.equalTo(e.get("num"), 
          id));

      // perform update
      this.em.createQuery(update).executeUpdate();
}
5n0oy7gb

5n0oy7gb2#

你问的

根据 predicate 更新一列(可能还有更多高级操作)。
更多细节和干净做法

对于基于条件的操作(如更新),最佳实践是使用javax.persistence.criteria接口(如CriteriaUpdate),并对 predicate 使用where()子句限制。
此外,对于 predicate 和列类型,您可以使用CriteriaBuilder API进行许多操作和聚合,例如将其他列或值附加到所需的列(路径)。

CriteriaUpdate<T> criteriaUpdate = criteriaBuilder.createCriteriaUpdate(type);
Root<T> updateRoot = criteriaUpdate.from(type);
Path<String> path = updateRoot.get(update_column);
criteriaUpdate.set(path, 'some_value');
entityManager.createQuery(criteriaUpdate.where(...)).executeUpdate()

注意,some_value甚至可以借助criteriaBuilder使用嵌套运算和聚合进行计算,例如

criteriaUpdate.set(path, criteriaBuilder.api(...));

在您的案例中进行总结,如下所示

CriteriaUpdate<TableAEntity> criteriaUpdate = builder.createCriteriaUpdate(TableAEntity.class);
Path<String> path = root.get("ww");
criteriaUpdate.set(path, value);
entityManager.createQuery(criteriaUpdate.where(criteriaBuilder.equal(root.get("num"), id) )).executeUpdate()
...

相关问题