如何在RowMapper类中包含内部列表

时间:2017-01-26 14:31:30

标签: java spring spring-jdbc

我对Spring JDBC RowMapper组织有疑问。

假设我的表格a包含字段idname,表格a_b和表格b

a
id integer
name character varying (16)

b
id integer
name character varying (16)

a_b
a_b_id integer
aid integer
bid integer

Class结构不是那么对称:

class A{
int id;
String name;
List<B> bs;
}

class B{
int id;
String name;
}

我想为A类构造一个RowMapper类。起始代码如下:

class AMapper implements RowMapper<A>{
     public A mapRow(ResultSet rs, int num){
        A a = new A();
        a.setId(rs.getInt("id"));
        a.setName(rs.getString("name"));
        return a;
     }
}

我怎样才能映射b的列表?有没有办法在没有in-mapper sql查询的情况下获得它?

1 个答案:

答案 0 :(得分:0)

如果你想用一个查询来获取它们,你将不得不使用JOIN来从多个表中获取(无论你使用LEFT join还是INNER,它取决于你想要实现的目标),这将返回一个矩阵组合列,在ResultSet中是这样的:

a_id | a_name | b_id | b_name | ...
------------------------------------
  1  | Name1A |  1   | Name1B | ...
  1  | Name1A |  2   | Name2B | ...
  1  | Name1A |  3   | Name3B | ...

虽然您有1条记录,但它与多个B相关联,并且会在每一行中。

您需要通过地图或设置跟踪A.像这样的东西(你可能需要调整它):

class AMapper implements RowMapper<A> {
    Map<Integer, A> aMap = new HashMap<>();

    public A mapRow(ResultSet rs, int num){
        A a = aMap.get(rs.getInt("id"));
        if(a == null){
           a = new A();
           a.setId(rs.getInt("a_id"));
           a.setName(rs.getString("a_name"));
           aMap.put(a.getId(), a);
        }
        B b = new B();
        b.setId(rs.getInt("b_id");
        b.setName(rs.getString("b_name"));
        a.addB(b);
    }
}