作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在更新查询中使用 Case 子句更新表的多行。
我有一个 Map<String, String>
其中包含 2 列的值。键作为行的标识符,映射中的值是我要更新的列的值。
如何在 spring 数据 JPA 中执行此操作 @Query
?
我想实现这样的目标
@Modifying
@Query("update RequestDetail rd set value = VALUE(:statusDetails) where name='Status' and RequestUuid=KEY(:statusDetails)")
void updateBulkStatus(Map<String, String> statusDetails);
但这给出了异常(exception) - antlr.SemanticException: node did not reference a map
.
目标是避免对数据库进行多次更新查询。
我们有什么更好的方法可以将具有多个值的多行更新为单个列。
最佳答案
您将需要执行如下操作:
Update RequestDetail rd set rd.value = CASE WHEN (rd.name = :name1) THEN :value1 WHEN (rd.name = :name2) THEN :value2 WHEN (rd.name = :name3) THEN :value3 END
但您不一定知道 map 中有多少项目,因此您需要生成查询文本,例如
String sql = "Update RequestDetail rd set CASE ";
int index = 1;
for (Map.Entry<String,String> entry : statusDetails.entrySet()) {
sql += " WHEN (rd.name = :name" + index + ") THEN :value" + (index++) + " ";
}
sql += " END";
您还需要将参数传递给您的查询。
关于java - 如何将 Hashmap 传递给 spring data jpa 方法并在更新语句中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62568725/
我是一名优秀的程序员,十分优秀!