[英]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.