【问题标题】:Unable to map JSON field from postgres DB to POJO class无法将 JSON 字段从 postgres DB 映射到 POJO 类
【发布时间】:2021-11-08 16:42:41
【问题描述】:

我有下面的代码,我试图从 postgres DB 中仅获取 1 列(JSON 类型)并将其映射到 POJO 类。但是,结果我得到了正确的计数,但只有空值,即使存在数据。感谢任何帮助/建议。

POJO 类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class EmployeePayload {

    private String empName;

    private String empID;

   //getters and setters
}

查询执行代码::

String query = "SELECT emp_payload FROM EmpDetails";
ResultSetHandler<List<EmployeePayload>> employeePayload = new BeanListHandler<EmployeePayload>(EmployeePayload.class);
        List<EmployeePayload> resultList = runner.query(dbConnection, query, employeePayload);

        log.info(":: resultList is :: " + resultList);

数据库中的数据 ::

"{""empName"":""james"",""empID"":""008""}", "{""empName"":""bond"",""empID"":""007""}"

日志中的结果 ::

resultList 是 :: [EmployeePayload{empName='null', empID='null'}, EmployeePayload{empName='null', empID='null'}]

【问题讨论】:

    标签: java json postgresql


    【解决方案1】:

    BeanListHandler 来自 apache dbutils (docs)

    通过查看文档/源代码,它是通过将单个列映射到 Bean 的单个属性来实现的。您实际上是在尝试将单个列映射到多个不起作用的属性。现在有两种方法可以解决这个问题:

    1. 编写自己的RowProcessor
    2. 重写查询以返回多列。

    在这种情况下,我倾向于第二种解决方案,因为它很简单,因为 postgres 为它的 json 字段类型内置了这个功能。

    您的查询可能如下所示:

    String query = "SELECT emp_payload->'empName' AS empName, emp_payload->'empID' AS empID FROM EmpDetails";
    

    (AS ... 可能不是必需的,但我不知道 psql 如何为提取的 json 值生成列名)。

    如果您直接在 postgres 中执行此查询,您将得到一个列名为 empName 和 empID 的结果集,这正是 BeanProcessor(BeanListHandler 的默认处理器)所期望的。

    【讨论】:

    • 我选择了第二种解决方案,谢谢。
    猜你喜欢
    • 2019-02-12
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2021-11-25
    • 2017-03-31
    • 2016-10-20
    相关资源
    最近更新 更多