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

Spring Boot不创建实体类调用PostgreSQL函数插入JSON数据报错求助

解决PostgreSQL函数调用的SQL语法错误问题

针对你遇到的BAD SQL Grammar Error,以下是具体的排查和修复方案:

核心问题分析

错误出现在SimpleJdbcCall.execute(params),大概率是因为参数匹配错误、函数元数据自动识别失败或者PostgreSQL函数定义与代码逻辑不匹配导致的。

修复后的代码实现

UserRepositoryImpl.java

@Override
public String saveDatahouse(JSONObject requestJSON) throws SQLException {
    JSONObject resultJSON = new JSONObject();
    Map<String, Object> params = new HashMap<>();

    try {
        PGobject pObj = new PGobject();
        pObj.setType("json");
        pObj.setValue(requestJSON.toString());

        // 显式声明参数与返回值,避免自动匹配出错
        SimpleJdbcCall insertSurveyCall = new SimpleJdbcCall(jdbcTemplate)
                .withFunctionName("add_data_to_db")
                // 输入参数名必须与PostgreSQL函数的参数名完全一致
                .declareParameters(new SqlParameter("params", Types.OTHER, "json"))
                // 声明返回值类型(PostgreSQL的json类型对应JDBC的Types.OTHER)
                .returningResultSet("return", new SingleColumnRowMapper<>(PGobject.class));

        params.put("params", pObj);
        Map<String, Object> result = insertSurveyCall.execute(params);

        // 提取函数返回的JSON结果
        PGobject returnObj = (PGobject) result.get("return");
        if (returnObj != null) {
            resultJSON = new JSONObject(returnObj.getValue());
        } else {
            resultJSON.put("status", "error");
            resultJSON.put("message", "函数未返回结果");
        }

        return resultJSON.toString();

    } catch (SQLException e) {
        e.printStackTrace();
        resultJSON.put("status", "error");
        resultJSON.put("message", e.getMessage());
        return resultJSON.toString();
    } catch (Exception e) {
        e.printStackTrace();
        resultJSON.put("status", "error");
        resultJSON.put("message", e.getMessage());
        return resultJSON.toString();
    }
}

关键排查步骤

  1. 验证PostgreSQL函数定义
    确保你的函数参数名、类型与代码完全匹配,示例函数定义如下:

    CREATE OR REPLACE FUNCTION add_data_to_db(params json)
    RETURNS json AS $$
    BEGIN
        -- 你的插入逻辑
        INSERT INTO your_table(data_column) VALUES(params);
        RETURN '{"status": "success"}'::json;
    END;
    $$ LANGUAGE plpgsql;
    

    如果函数使用jsonb类型,需将代码中pObj.setType("json")改为pObj.setType("jsonb")。

  2. 开启SQL日志排查实际执行语句
    在application.properties中添加日志配置,查看生成的SQL语句,直接复制到PostgreSQL客户端执行验证:

    logging.level.org.springframework.jdbc=DEBUG
    logging.level.org.springframework.jdbc.core=DEBUG
    
  3. 确保JDBC驱动版本兼容
    使用与PostgreSQL版本匹配的最新驱动,Maven依赖示例:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.6.0</version>
    </dependency>
    
  4. 验证JSON格式合法性
    确保requestJSON是合法的JSON字符串,避免因格式错误导致函数执行失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:53