【问题标题】:How to pass Hashmap into spring data jpa method and use that in update statement?如何将 Hashmap 传递给 spring data jpa 方法并在更新语句中使用它?
【发布时间】:2020-10-15 12:28:25
【问题描述】:

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

我有一个Map<String, String>,其中包含 2 列的值。键作为行的标识符,映射中的值是我要更新的列的值。

如何在 Spring Data JPA @Query 中做到这一点?

我想实现类似的目标

@Modifying

@Query("update RequestDetail rd set value = VALUE(:statusDetails) where name='Status' and RequestUuid=KEY(:statusDetails)")
void updateBulkStatus(Map<String, String> statusDetails);

但这是例外 - antlr.SemanticException: node did not reference a map

目标是避免对 DB 进行多次更新查询。

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

【问题讨论】:

  • 你可以使用createNativeQuery(),它会返回一个Object[]类型的List。

标签: java spring-boot spring-data-jpa jpql


【解决方案1】:

您需要执行以下操作:

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";

您还需要将参数传递给您的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2018-01-09
    • 2021-11-11
    • 2016-11-26
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多