在实际应用中,经常有如下表:
log200501,log200502,log200503,log200504........一次每月一张表,
这些表结构都是相同的,且每个月产生一张。
然后又如下的查询条件,用户选择2005年7月到11月进行查询。要求从多张表中返回符合条件的记录,并且分页显示。
由于表是在动态增长的,因此在hibernate里不可能对每张表进行映射。
通过构造视图,然后对视图进行映射的方法也不太妥当。因为创建视图的sql不能够动态改变,并且效率也不高。
打算利用DetachedCriteria也没找到怎么样动态映射到同结构的表进行查询。
因此封装了一个方法:
/**
* 对多张同结构的表进行分页查询
* @param c Class 需要转换出来的类
* @param tablenames String[] 多张表名
* @param whereSql String where条件 " where aa= ? and bb =? "
* @param values Object[] 参数值
* @param page Pagination 分页信息
* @return List
*/
public List search(final Class c, final String[] tablenames,
final String whereSql,
final Object[] values, final Pagination page) {
//先计算所有的表中符合条件的记录数。
//然后根据分页信息计算出需要查询数据的表,并计算好各表中的起始位置和记录条数
//在查询各个需要提供数据的表,将结果集合并
//以一个list返回出去。
}
调用流程如下,根据用户选择的时间范围得到需要涉及到查询的表名,然后再加上相关参训条件,调用该方法即可分业查询。
目前代码功能已经实现,但是存在以下几个缺陷
1.只能够是单表查询,不支持 select * from log20050* ,userinfo where 1=1 这样的语句。这个缺陷可以后期处理掉,目前暂时没这个必要
2.返回的list中是全部的字段,目前只支持select * ,这个也可以处理掉。
3.字段排序只能够在每张表中单独进行,比如log200501里排序完毕,然后log200502里排序完毕,但是01和02的表结果集合在一起却不是排好序的。
这就是无法对所有符合条件的记录进行排序,这个不好做,数据库基础不扎实:(
或许应该有办法可以解决。
当然,应付目前的应用用来做日志类查询已经基本满足需求。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=663515