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(); } }
关键排查步骤
验证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")。开启SQL日志排查实际执行语句
在application.properties中添加日志配置,查看生成的SQL语句,直接复制到PostgreSQL客户端执行验证:logging.level.org.springframework.jdbc=DEBUG logging.level.org.springframework.jdbc.core=DEBUG确保JDBC驱动版本兼容
使用与PostgreSQL版本匹配的最新驱动,Maven依赖示例:<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> </dependency>验证JSON格式合法性
确保requestJSON是合法的JSON字符串,避免因格式错误导致函数执行失败。
内容的提问来源于stack exchange,提问作者shameera
相关产品推荐
相关产品推荐

