JDBC使用现有RowMapper映射同一个表的连接

时间:2014-11-14 14:38:01

标签: java mysql spring-jdbc

我有一个连接表的查询:

SELECT * FROM data d1 join data d2 ON d1.id != d2.id WHERE ...

我已经拥有RowMapper Data,这是表data的java对象。现在,我可以逐个映射字段并构建两个Data对象:

jdbcTemplate.query(sql, new RowMapper()
        {

            @Override
            public Object mapRow(ResultSet arg0, int arg1) throws SQLException
            {
                Data d1 = new Data();
                Date d2 = new Date();
                Data [] duple = new Data []{d1, d2};

                d1.setId(arg0.getLong(1));
                d1.setRegistryName(arg0.getString(2));
                ...
                d2.setId(arg0.getLong(11));
                d2.setRegistryName(arg0.getString(12));
                ...

                return duple;
            }
        });

但是,这是很多手工工作。所以我可以使用我的DataRowMapper来映射第一个对象,但是我必须手动映射第二个对象:

jdbcTemplate.query(sql, new RowMapper()
        {

            @Override
            public Object mapRow(ResultSet arg0, int arg1) throws SQLException
            {
                Data d1 = new Data();
                Date d2 = new Date();
                Data [] duple = new Data []{d1, d2};
                d1 = new DataRowMapper<ShopSyncInfo>(Data.class).mapRow(arg0, arg1);

                d2.setId(arg0.getLong(11));
                d2.setRegistryName(arg0.getString(12));
                ...

                return duple;
            }
        });

所以我想以同样的方式映射第二个对象。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

支持映射Spring Data JDBC Extensions项目中提供的一对多关系。请参阅docs。您需要将此项目添加到您的构建中。但是,您不需要额外的Oracle支持,因此以下依赖性就足够了:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jdbc-core</artifactId>
    <version>1.1.0.RELEASE</version>
</dependency>

我认为你可以将它改编为一对一的映射。