当前位置: 代码迷 >> SQL >> 多表同构造的Native sql查询
  详细解决方案

多表同构造的Native sql查询

热度:74   发布时间:2016-05-05 13:08:59.0
多表同结构的Native sql查询
查询中相同结构的表
比如销售纪录的表
一天生成一个或者别的方式生成,结构相同,我们可以把他作为一个表做一个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里面
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中的数据和视图中的数据不一致
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的工作可以考虑在不繁忙的适当的时候干),这样查询/统计该月的数据只需要访问该表
真要提供高度灵活的查询时段供用户选择(比如查询/统计任意两天之间的销量),你可有苦头可吃了~~~
8 楼 antonyup_2006 2007-11-07  
数据表的整合,定时去把一些表整合到一个表或几个表,可以考虑用job,定时去后台整合,而代码里只要操作整合好后的表就可以了.这样不用在代码里去整合!
  相关解决方案