2017-01-26 27 views
0

我有一個關於Spring JDBC RowMapper組織的問題。我該如何在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 A{ 
int id; 
String name; 
List<B> bs; 
} 

class B{ 
int id; 
String name; 
} 

我想構造一個RowMapper的類一類A.開頭代碼的樣子:

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查詢?

+0

可能重複http://stackoverflow.com/questions/25727099/mapping-relational-db-to-a-listobject-each-containing-a -listobject-using-jdb/25727905#25727905 – Redlab

回答

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's。像這樣的東西(你可能需要調整的話):的

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); 
    } 
} 
+0

嗨isah!不幸的是,它似乎不適用於queryForObject – user2957954

+0

有什麼問題?我建議的代碼除了是'queryForObject'接受的有效RowMapper實現之外,與'queryForObject'沒有任何關係。 – isah

+0

其實沒關係。但結果行集(在行映射器開始映射之前)不包含僅一行(例如,a_id = 1,bid = 1和a_id = 1且bid = 2)以及對象拋出異常的查詢。所以,queryFor對象接受這樣的實現作爲參數,但不適用於它。 – user2957954

相關問題