我正在从主详细信息表创建一个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;
}
});
有更好的方法吗?
答案 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在这里可能会有用。