本文只是针对SSH框架下总结的,JSP上的显示使用struts标签与jstl标签。
先说解决思路:A类与B类进行联合查询,并且A类与B类还有一对多的关系。查询出来的结果,分别使用两个List接收。然后创建一个中间类C,此类用来接收A类及B类的集合(即List,这样A类与B类在C类中又有了一对多的关系。),将A类的List中的对象set至C类,与之相对应的B类先添加至一个List中,再将List set至C类。最后在页面上的显示就需要使用jstl标签来解决。
效果图如下所示:
上图中由红色标出的即是B类的数据,其他则是A类的数据。可以看到在页面也是呈现了一对多的关系。
要说明的是,B类中保存了A类的id。这样才能这个字段在查询的时候将两张表关联起来。
hql代码:
query = "from CreateContract c,Item i where c.id = i.contract_id"+" order by c.id desc";
List list = this.getList(hql,page.getPageSize(), page.getStartRow());
这个结果集怎么来的,不在本文的讨论当中,我们只需关心怎么处理这个结果集list。
根据之前所说的思路,可以先创建两个List.
List createContracts = new ArrayList();
List- items = new ArrayList
- ();
然后遍历list集合,分别赋值给上述两个List
for(int i = 0;i
因为list是两张表的结果集,因此其中的每一个元素都是由两个类组成,所以在接收的时候需要使用Object数组,然后再进行转换。
其实这样还会有一个问题出现,就是createContracts中会有重复的元素。因为CreateContract是一的一方,因此联合查询出来必然会出现重复的数据。如果不加以处理,在最后页面显示的时候会出现如下情况:
这样看起来就会有点不爽了。于是在createContracts那行代码需稍微修改一下:
List createContracts = SetUniqueList.decorate(new ArrayList());
SetUniqueList.decorate()可以去掉重复的元素,想了解的朋友可以查看API。
为了能接收上述两个List中的值,我们可以再创建一个中间类TempClass。此类代码如下:
public class TempClass {
private List- items;
private CreateContract createContract;
public List
- getItems() {
return items;
}
public void setItems(List
- items) {
this.items = items;
}
public CreateContract getCreateContract() {
return createContract;
}
public void setCreateContract(CreateContract createContract) {
this.createContract = createContract;
}
}
然后再创建一个用来接收TempClass的List.
List temps = new ArrayList();
接下来我们只需要对上述两个List进行遍历就差不多了。
//第一层for循环,遍历一的一方createContracts
for(int i = 0;i its = new ArrayList- ();
//第二层for循环,遍历多的一方items
for(int j = 0;j
最后将temps放到reqeust中就可以了。
request.setAttribute("list", temps);
这样,在后台中对于多表查询结果集的处理就完成了。最后就是需要在前台显示了。
这个显示理论上有两种方法。一种是,一的一方的所占用的行数根据其所对应的多的一方的行数来决定。另一种则是,在多的一方中用水平线来分割。本人采用的是第二种方法。
JSP页面上的代码如下:
第一个for循环
至此,多表联合查询结果集在JSP页面上显示的问题得到解决。
最后把后台代码统一贴出来,前三行代码可以忽略。
String countHql = this.getSurveyString(itemid,contract_no,create_date,0);
String hql = this.getSurveyString(itemid,contract_no,create_date,1);
//返回分页page bean
Page page = this.getPage(request, countHql);
//返回显示数据
List list = this.getList(hql,page.getPageSize(), page.getStartRow());
//创建中间类TempClass的List。
List temps = new ArrayList();
// //createContract接收create_contract表中的值
//去掉重复的元素
List createContracts = SetUniqueList.decorate(new ArrayList());
// //item接收item表中的值
List- items = new ArrayList
- ();
System.out.println("一共有: "+list.size()+" 记录");
for(int i = 0;i
its = new ArrayList- ();
//第二层for循环,遍历多的一方items
for(int j = 0;j