当前位置: 首页 > 知识库问答 >
问题:

JDBCTemplate使用BeanPropertyRowMapper设置嵌套POJO

赵嘉赐
2023-03-14

给出以下POJO示例:(假设所有属性都是getter和setter)

class User {
    String user_name;
    String display_name;
}

class Message {
    String title;
    String question;
    User user;
}

可以轻松地查询数据库(在我的例子中是postgres),并使用BeanPropertyRowMapper填充消息类列表,其中db字段与POJO中的属性匹配:(假设db表具有与POJO属性对应的字段)。

NamedParameterDatbase.query("SELECT * FROM message", new BeanPropertyRowMapper(Message.class));
SELECT * FROM message, user WHERE user_id = message_id

生成已填充关联用户的消息列表

用例:

最终,这些类作为序列化对象从Spring控制器传递回来,这些类被嵌套,这样得到的JSON/XML就有了一个合适的结构。

SELECT title AS "message.title", question AS "message.question", user_name AS "user.user_name", display_name AS "user.display_name" FROM message, user WHERE user_id = message_id

然后,自定义行映射器创建几个bean映射,并根据列的前缀设置它们的属性:(使用元数据获取列名)。

public Object mapRow(ResultSet rs, int i) throws SQLException {

    HashMap<String, BeanMap> beans_by_name = new HashMap();

    beans_by_name.put("message", BeanMap.create(new Message()));
    beans_by_name.put("user", BeanMap.create(new User()));

    ResultSetMetaData resultSetMetaData = rs.getMetaData();

    for (int colnum = 1; colnum <= resultSetMetaData.getColumnCount(); colnum++) {

        String table = resultSetMetaData.getColumnName(colnum).split("\\.")[0];
        String field = resultSetMetaData.getColumnName(colnum).split("\\.")[1];

        BeanMap beanMap = beans_by_name.get(table);

        if (rs.getObject(colnum) != null) {
            beanMap.put(field, rs.getObject(colnum));
        }
    }

    Message m = (Task)beans_by_name.get("message").getBean();
    m.setUser((User)beans_by_name.get("user").getBean());

    return m;
}

同样,对于一个两个类的联接来说,这似乎有些过头了,但是IRL用例涉及到多个表和几十个字段。

共有1个答案

贾俊喆
2023-03-14

也许您可以传入一个自定义的rowmapper,它可以将聚合联接查询的每一行(在消息和用户之间)映射到消息和嵌套的用户。类似于这样:

List<Message> messages = jdbcTemplate.query("SELECT * FROM message m, user u WHERE u.message_id = m.message_id", new RowMapper<Message>() {
    @Override
    public Message mapRow(ResultSet rs, int rowNum) throws SQLException {
        Message message = new Message();
        message.setTitle(rs.getString(1));
        message.setQuestion(rs.getString(2));

        User user = new User();
        user.setUserName(rs.getString(3));
        user.setDisplayName(rs.getString(4));

        message.setUser(user);

        return message;
    }
});
 类似资料:
  • 问题内容: 给定以下示例POJO :(假定所有属性的Getter和Setter) 可以轻松地查询数据库(在我的情况下为postgres),并使用BeanPropertyRowMapper填充Message类的列表,其中db字段与POJO中的属性匹配:(假定DB表具有与POJO属性对应的字段)。 我想知道-是否有一种方便的方法来构造单个查询和/或以这种方式创建行映射器,以也在消息中填充内部“用户”

  • 我有问题,需要帮助。 问题是我正在尝试使用 jdbctemplate 和映射获取查询的结果,该结果导致我的 File 类。 我的类文件包含3O个属性:10个长、字符串和日期类型的属性。 我正在执行的查询: 当执行查询时,它不会给我一个错误,一切都是正确的,但是当显示结果时,列出来为空,错误是由于我使用的查询使用别名,别名与File类的属性名称不匹配。 这就是我的问题或查询,因为我不能更改类属性的名

  • 我有一个带有用户表的标准MySql数据库。在这个表中有一个名为“isApproved”的TINYINT(4) 即使数据库中有“1”,也会返回“false”。 我如何使这个映射正确,isApproved是“1”,这应该等同于true作为布尔值。

  • 我下面设置了一个名为“form”的JSP属性 这是有效的。属性“form”包含一个Java对象,它将用于进一步评估和稍后在JSP中显示。但是,我想在不事先知道表单名称的情况下以更通用的方式使用它——它可以被命名为例如“ModelForm”而不是“buildForm”。如果我们假设我已经将变量的名称存储在JSP属性“formName”中 如何使用它来设置JSP属性“form”,如第一个代码示例中所示

  • 我正试图使用Spring JDBCTemplate从数据库中获取一条记录。在JdbcTemplate中,我试图通过使用类BeanPropertyRowMapper来自动化数据绑定。我的数据库表列名称类型和模型对象字段名称类型是相同的…我实现了这个API,但我没有得到预期的结果…对于int和double字段,我得到0和0.0值,尽管这些值在数据库中是不同的... 请帮助解决这个问题...我的代码如下

  • 我有这门课: 并希望在“列表”状态数组中的“卡片”数组上使用setState。以前,我在子组件中使用了cards数组,但现在我将其上移到Board类。这是我以前拥有的功能。 我如何改变它,使它现在工作,卡是在另一个数组? 我无法解决它看这些帖子: ReactJS-数组中对象键的设置状态 如何编辑状态数组中的项?