从主详细信息表创建Java Bean - 性能问题

时间:2011-08-24 21:24:34

标签: sql spring

我正在从主详细信息表创建一个java bean。让我们调用主表A和详细信息表B.当我进入java bean时,我有BeanA和BeanB。 BeanA将包含A表中的所有相关行,并且还将具有基于主键的BeanB(详细信息表B)的列表集合。所以BeanA看起来像

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

在这个场景中我使用Spring JDBC来查询表。因此,当我查询表A并遍历结果集并设置BeanA属性时,我还将通过对B表执行查询来设置lstproperty。

所以代码将是

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

使用左连接:

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

(实际上你应该明确地列出所有列并为每个列分配别名)。

此查询将检索每对A-B的一行,并且还将检索所有没有B的As。

对于每一行,查看您是否已经拥有返回A ID的A.如果没有,构造A并将其放在地图中(由A ID索引)。然后使用B表中的列构造一个B实例(除非返回的B ID为null,这意味着A没有B),并将其添加到从地图获得的A的B列表中或刚刚构建

请注意,像JPA这样的ORM使这项繁琐的工作变得更加容易:它们会为您提供单个请求的对象树。

答案 1 :(得分:0)

如果你有机会使用Hibernate,那么lazy-fetching concept在这里可能会有用。