2011-08-24 74 views
0

我創建從主詳細表中的java bean。讓我們調用主表A和詳細信息表B.當我把它放入一個java bean中時,我有BeanA和BeanB。 BeanA將擁有A表中的所有相關行,並且還將具有基於主鍵的BeanB(細節表B)的列表集合。所以BeanA看起來像從主詳細信息表創建一個Java Bean - 性能比較的問題

class BeanA { 
    String property1; 
    String Property2; 
    List<BeanB> lstpropery; //This is the data of detail table based on the primary key 
} 

在這個scenerio我使用Spring JDBC來查詢表。因此,當我查詢表A並遍歷結果集並設置BeanA屬性時,我還將通過對B表執行查詢來設置lst屬性。

這樣的代碼將

String qry = "select * from A'; 
result = this.queryTemplate.query(qry, obj, new RowMapper(){ 
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException { 
     BeanA bean1= new BeanA();       
     bean1.setProperty1(rs.getString(1)); 
     bean1.setProperty2(rs.getString(2)); 
     bean1.setLstpropery(callTableB(String primaryKey)); // I see a performance issue here 
     return bean1; 
    } 
}); 

有沒有更好的方式來做到這一點?

回答

1

使用左連接:

select a.*, b.* from A a left outer join B b on a.id = b.aId 

(你應該明確地實際上列出所有列和別名分配給每個人)。

這個查詢將檢索每對夫婦A-B行,也將檢索所有這些都沒有B.

每一行的作爲,看你是否已經與返回的ID的一個。如果沒有,則構建A並放入地圖(由A ID索引)。然後構造A B實例與從B表中的列(除非返回乙ID爲空,這意味着A沒有B),並把它添加到A的你從地圖上得到或只是構造B的列表。

請注意,像JPA這樣的ORM使得這個繁瑣的工作變得更加容易:它們從一個請求中填充一個對象樹。

+0

感謝您的答覆,我使用Spring的JdbcTemplate,有沒有更好的方式來做到這一點使用spirng? –