论坛首页 Java企业应用论坛

多表同结构的Native sql查询

浏览 4851 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-13  
查询中相同结构的表
比如销售纪录的表
一天生成一个或者别的方式生成,结构相同,我们可以把他作为一个表做一个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();
    }
   发表时间: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();
    }
0 请登录后投票
   发表时间: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里面
0 请登录后投票
   发表时间:2007-07-13  
在使用native sql做普通查询的时候,是不是lasy就不起作用了,因为我设置了lazy="true"的字段还是在检索的时候一起被取出来放bean里面了
0 请登录后投票
   发表时间:2007-07-13  
另外一种解决方式是使用视图,把你要检索的数据的表在检索前生成一个view,这个wiew就叫一个名字
比如我这个叫SellInfo,对这个视图进行映射,这样你就不用使用native sql进行查询了,可以直接使用QBC检索,当然了,要把
cache.use_query_cache设置成false,否则可能cache中的数据和视图中的数据不一致
0 请登录后投票
   发表时间:2007-07-13  
比如说,我要查5天的数据,可以把这5天对应的5个表full union成一个视图,这样就能同时检索这5个表,象使用一个表一样,但是有个问题,在使用sql2000的时候有个限制,最多可以操作260个表......
0 请登录后投票
   发表时间:2007-11-06  
用这种方式的话,小心sql注入
0 请登录后投票
   发表时间:2007-11-07  
看起来数据量很大啊,得每天一表~~~
那你再根据常用的统计时段为每个时段建一个表,比如每月一表,该表的数据由每月各天的数据sum而来(sum的工作可以考虑在不繁忙的适当的时候干),这样查询/统计该月的数据只需要访问该表
真要提供高度灵活的查询时段供用户选择(比如查询/统计任意两天之间的销量),你可有苦头可吃了~~~
0 请登录后投票
   发表时间:2007-11-07  
数据表的整合,定时去把一些表整合到一个表或几个表,可以考虑用job,定时去后台整合,而代码里只要操作整合好后的表就可以了.这样不用在代码里去整合!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics