2011-08-24 79 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? –