You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析Map<String,Object>生成字符串值带单引号的SQL键值拼接串

实现方案

不需要引入任何额外依赖,直接基于JDK原生能力即可完成Map到目标格式字符串的解析,适配UPDATE语句SET子句的构造需求。

核心逻辑

  • 遍历Map的每一组键值对
  • 按值类型做格式化处理:字符串类型的值用单引号包裹,数值类型(Integer、Double等)直接转换为字符串拼接
  • 单组键值对固定拼接为key = 格式化后的值格式
  • 多组键值对之间用逗号分隔,推荐使用StringBuilder做字符串拼接,性能优于直接用+累加

修正后的接口实现代码

原有update方法的拼接逻辑存在缺失,没有将等号、处理后的值和对应键绑定,修正后的完整代码如下:

@Transactional
@PutMapping(value = "/config/test/{tableName}/{schemaName}/{id}")
public Map<String, Object> updateValue(@RequestBody Map<String, Object> values, 
                                       @PathVariable("tableName") String tableName,
                                       @PathVariable("schemaName") String schemaName, 
                                       @PathVariable("id") String id) {
    StringBuilder setSegment = new StringBuilder();
    boolean firstPair = true;

    for (Map.Entry<String, Object> entry : values.entrySet()) {
        String key = entry.getKey();
        Object value = entry.getValue();
        // 非首组键值对前拼接逗号分隔符
        if (!firstPair) {
            setSegment.append(",");
        }
        firstPair = false;
        // 拼接键和等号
        setSegment.append(key).append(" = ");
        // 按值类型做格式化
        if (value instanceof String) {
            setSegment.append("'").append(value).append("'");
        } else if (value instanceof Integer || value instanceof Double) {
            setSegment.append(value);
        }
        // 如需支持Long、Boolean、时间等其他类型,可在此处追加类型判断分支
    }

    // 兼容字符串类型ID的场景,非数字ID自动包裹单引号避免SQL语法错误
    String idCondition = id.matches("\\d+") ? id : "'" + id + "'";
    final String sql = String.format("UPDATE %s.%s SET %s WHERE ID = %s", 
            schemaName, tableName, setSegment, idCondition);
    final Query query = em.createNativeQuery(sql);
    query.executeUpdate();
    return values;
}

注意事项

直接拼接原生SQL存在SQL注入安全隐患,如果后续业务对安全性要求较高,可以直接使用JPA自带的原生SQL参数绑定能力实现,同样不需要引入额外依赖。

内容的提问来源于stack exchange,提问作者Doncarlito87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:51:24