2005年12月19日

在实际应用中,经常有如下表:

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的表结果集合在一起却不是排好序的。

这就是无法对所有符合条件的记录进行排序,这个不好做,数据库基础不扎实:(

或许应该有办法可以解决。

当然,应付目前的应用用来做日志类查询已经基本满足需求。