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
Java 如何将Hashmap传递到spring数据jpa方法中,并在update语句中使用它?_Java_Spring Boot_Spring Data Jpa_Jpql - Fatal编程技术网

Java 如何将Hashmap传递到spring数据jpa方法中,并在update语句中使用它?

Java 如何将Hashmap传递到spring数据jpa方法中,并在update语句中使用它?,java,spring-boot,spring-data-jpa,jpql,Java,Spring Boot,Spring Data Jpa,Jpql,我想在update查询中使用Case子句更新表的多行 我有一个映射,它包含两列的值。键作为行的标识符,映射中的值是我要更新的列的值 如何在spring数据JPA@Query中执行此操作 我想实现这样的目标 @Modifying @Query("update RequestDetail rd set value = VALUE(:statusDetails) where name='Status' and RequestUuid=KEY(:statusDetails)") v

我想在update查询中使用Case子句更新表的多行

我有一个
映射
,它包含两列的值。键作为行的标识符,映射中的值是我要更新的列的值

如何在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);
修改 @查询(“更新RequestDetail rd set value=value(:statusDetails),其中name='Status'和RequestUuid=KEY(:statusDetails)”) 无效更新BulkStatus(地图状态详情); 但这给出了一个异常-
antlr.SemanticException:节点没有引用映射

目标是避免对数据库进行多次更新查询


有什么更好的方法可以将具有多个值的多行更新为一列。

您需要执行以下操作:

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
但您不一定知道地图中有多少项,因此需要生成查询文本,如

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";
String sql=“Update RequestDetail rd set CASE”;
int指数=1;
对于(Map.Entry:statusDetails.entrySet()){
sql++=“当(rd.name=:name“+index+”)然后:值“+(index++)+”;
}
sql+=“结束”;
您还需要将参数传递给查询。

您可以使用createNativeQuery(),它将返回Object[]类型的列表。