Postgres数据库JSON字段无法映射到POJO类返回全为null如何解决
问题原因
Apache DbUtils 提供的BeanListHandler默认只会将SQL查询返回的结果集列名与POJO的字段名一一匹配赋值,你当前的查询仅返回emp_payload这一个JSON类型的列,而EmployeePayload类中没有名为emp_payload的对应字段,也不会自动解析JSON内容映射到类的属性上,因此最终得到的所有字段值都是null。
解决方案
方案1:修改SQL直接展开JSON字段(最简便)
利用PostgreSQL自带的JSON运算符->>直接把JSON内部的字段展开为结果集列,别名和POJO字段名保持一致,即可直接用原生BeanListHandler完成映射:
// SQL中直接提取JSON内部字段,别名与POJO字段名匹配 String query = "SELECT emp_payload->>'empName' AS empName, emp_payload->>'empID' AS empID FROM EmpDetails"; ResultSetHandler<List<EmployeePayload>> employeePayload = new BeanListHandler<EmployeePayload>(EmployeePayload.class); List<EmployeePayload> resultList = runner.query(dbConnection, query, employeePayload);
方案2:自定义ResultSetHandler实现JSON解析
如果需要保留原查询逻辑,自己实现结果集处理逻辑,用JSON解析工具(比如Jackson)将取出的JSON字符串转换为对应的POJO:
// 提前初始化Jackson的ObjectMapper,全局复用即可 ObjectMapper objectMapper = new ObjectMapper(); String query = "SELECT emp_payload FROM EmpDetails"; // 自定义ResultSetHandler ResultSetHandler<List<EmployeePayload>> handler = new ResultSetHandler<List<EmployeePayload>>() { @Override public List<EmployeePayload> handle(ResultSet rs) throws SQLException { List<EmployeePayload> resultList = new ArrayList<>(); while (rs.next()) { // 取出JSON列的字符串内容 String jsonContent = rs.getString("emp_payload"); try { // 解析为EmployeePayload对象 EmployeePayload payload = objectMapper.readValue(jsonContent, EmployeePayload.class); resultList.add(payload); } catch (JsonProcessingException e) { // 按需处理解析异常 throw new SQLException("JSON解析失败", e); } } return resultList; } }; List<EmployeePayload> resultList = runner.query(dbConnection, query, handler);
如果用方案2需要确保项目中引入了Jackson的相关依赖,且EmployeePayload类的getter、setter方法正常可用。
内容的提问来源于stack exchange,提问作者Balaji211
相关产品推荐
相关产品推荐

