簡體   English   中英

JPA 根據列名更新

[英]JPA update based on column name

我想將值更新為用戶輸入的特定列。 這是我的代碼,有人如何修改它以更正一個嗎?

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();    
}

您應該針對您的情況進行標准構建器查詢...如果您使用的是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();
}

您詢問

基於謂詞更新一列(可能還有更高級的操作)。

更多細節和干凈的做法

更新等基於條件的操作的最佳實踐是使用javax.persistence.criteria接口,如CriteriaUpdate並在謂詞上使用where()子句限制。

此外,關於您的謂詞和列類型,您可以使用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()

請注意,甚至可以在criteriaBuilder的幫助下使用嵌套操作和聚合來計算some_value

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()
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM