查询中相同结构的表
比如销售纪录的表
一天生成一个或者别的方式生成,结构相同,我们可以把他作为一个表做一个mapping和一个bean
比如销售信息SellInfo
在dao中用native sql统计查询(普通的查询我就不说了)
/** * 单店统计查询 * @param tableName 查询表名 * @param sellInfo 查询例子 * @param startTime 开始时间 * @param finishTime 结束时间 * @param sumBy 按什么求和 * @param groupBy 按什么分组 * @return 数量 项目 */ public List queOneShopGrp(String tableName,SellInfo sellInfo,Date startTime,Date finishTime,String sumBy,String groupBy) { Session session = this.getSession(); StringBuffer sql = new StringBuffer(); sql.append("select sum(S."); sql.append(sumBy); sql.append(") as sumMoney,S."); sql.append(groupBy); sql.append(" as foodName from "); sql.append(tableName); sql.append(" S where"); if(sellInfo!=null) { sql.append(this.getExampleStringS(sellInfo)); } sql.append(" S.sellTime between :startTime and :finishTime "); sql.append("group by S."); sql.append(groupBy); System.out.println(sql.toString()); Query query = session.createSQLQuery(sql.toString()) .addScalar("sumMoney", Hibernate.DOUBLE) .addScalar("foodName", Hibernate.STRING) .setDate("startTime", startTime) .setDate("finishTime", finishTime); return query.list(); }
1 楼 laiseeme 2007-07-13
还有生成where句子的函数
/** * 生成根据例子类的where子句 * @param sellInfo * @return */ public String getExampleStringS(SellInfo sellInfo) { StringBuffer sql = new StringBuffer(); if(sellInfo.getUserName()!=null) { sql.append(" S.userName = '"); sql.append(sellInfo.getUserName()); sql.append("' and"); } if(sellInfo.getFoodId()!=null) { sql.append(" S.foodId = '"); sql.append(sellInfo.getFoodId()); sql.append("' and"); } if(sellInfo.getClassId()!=null) { sql.append(" S.classId = '"); sql.append(sellInfo.getClassId()); sql.append("' and"); } if(sellInfo.getPosId()!=null) { sql.append(" S.posId = '"); sql.append(sellInfo.getPosId()); sql.append("' and"); } //去掉最后一个and //return sql.substring(0, (sql.length()-3)); return sql.toString(); }
2 楼 laiseeme 2007-07-13
拼出来的sql语句是
select sum(S.smallTotal) as sumMoney,S.foodName as foodName from XC_2007_0240_001 S where S.foodId = '001' and S.sellTime between ? and ? group by S.foodName
这里要注意的是
# Query query = session.createSQLQuery(sql.toString())
# .addScalar("sumMoney", Hibernate.DOUBLE)
# .addScalar("foodName", Hibernate.STRING)
这里,一定对你每个要查询的起个别名,而且对每个数据要要加上.addScalar,要不然他会将数据淫塞到bean里面
select sum(S.smallTotal) as sumMoney,S.foodName as foodName from XC_2007_0240_001 S where S.foodId = '001' and S.sellTime between ? and ? group by S.foodName
这里要注意的是
# Query query = session.createSQLQuery(sql.toString())
# .addScalar("sumMoney", Hibernate.DOUBLE)
# .addScalar("foodName", Hibernate.STRING)
这里,一定对你每个要查询的起个别名,而且对每个数据要要加上.addScalar,要不然他会将数据淫塞到bean里面
3 楼 laiseeme 2007-07-13
在使用native sql做普通查询的时候,是不是lasy就不起作用了,因为我设置了lazy="true"的字段还是在检索的时候一起被取出来放bean里面了
4 楼 laiseeme 2007-07-13
另外一种解决方式是使用视图,把你要检索的数据的表在检索前生成一个view,这个wiew就叫一个名字
比如我这个叫SellInfo,对这个视图进行映射,这样你就不用使用native sql进行查询了,可以直接使用QBC检索,当然了,要把
cache.use_query_cache设置成false,否则可能cache中的数据和视图中的数据不一致
比如我这个叫SellInfo,对这个视图进行映射,这样你就不用使用native sql进行查询了,可以直接使用QBC检索,当然了,要把
cache.use_query_cache设置成false,否则可能cache中的数据和视图中的数据不一致
5 楼 laiseeme 2007-07-13
比如说,我要查5天的数据,可以把这5天对应的5个表full union成一个视图,这样就能同时检索这5个表,象使用一个表一样,但是有个问题,在使用sql2000的时候有个限制,最多可以操作260个表......
6 楼 抛出异常的爱 2007-11-06
用这种方式的话,小心sql注入
7 楼 movingboy 2007-11-07
看起来数据量很大啊,得每天一表~~~
那你再根据常用的统计时段为每个时段建一个表,比如每月一表,该表的数据由每月各天的数据sum而来(sum的工作可以考虑在不繁忙的适当的时候干),这样查询/统计该月的数据只需要访问该表
真要提供高度灵活的查询时段供用户选择(比如查询/统计任意两天之间的销量),你可有苦头可吃了~~~
那你再根据常用的统计时段为每个时段建一个表,比如每月一表,该表的数据由每月各天的数据sum而来(sum的工作可以考虑在不繁忙的适当的时候干),这样查询/统计该月的数据只需要访问该表
真要提供高度灵活的查询时段供用户选择(比如查询/统计任意两天之间的销量),你可有苦头可吃了~~~
8 楼 antonyup_2006 2007-11-07
数据表的整合,定时去把一些表整合到一个表或几个表,可以考虑用job,定时去后台整合,而代码里只要操作整合好后的表就可以了.这样不用在代码里去整合!