职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 602|回复: 18

hibernate对复杂sql的处理。

  [复制链接]
楠楠 发表于 2011-7-21 10:19 | 显示全部楼层 |阅读模式
可能是我不太会写hql,有下面一段sql:
Sql代码  
select t.d,c,count(*) from (select date(receiveTime) d, count(userId) c from t_online_awards where receiveTime is not null group by userId,date(receiveTime)) t where t.c = 2  

select t.d,c,count(*) from (select date(receiveTime) d, count(userId) c from t_online_awards where receiveTime is not null group by userId,date(receiveTime)) t where t.c = 2 意思是查询
Sql代码  
t_online_awards 下面根据userId和date(receiveTime)分组查询总人数:count(userId),总记录数:count(*) ,日期:date(receiveTime)  

t_online_awards 下面根据userId和date(receiveTime)分组查询总人数:count(userId),总记录数:count(*) ,日期:date(receiveTime)Sql代码  
用sql是可以查询通过的,但是hql不识别。解决办法大概有2个:  

用sql是可以查询通过的,但是hql不识别。解决办法大概有2个:Sql代码  
1、createSqlQuery 但是使用原生sql的话,数据库移植、orm 都成了泡影。  

1、createSqlQuery 但是使用原生sql的话,数据库移植、orm 都成了泡影。Sql代码  
2、一步一步的查询,先查 count(userId),再查。。。。 这样的话又显得麻烦  

2、一步一步的查询,先查 count(userId),再查。。。。 这样的话又显得麻烦Sql代码  
各位是怎么处理的。另外用hql有没办法。  

各位是怎么处理的。另外用hql有没办法。

shmilyyu 发表于 2011-7-21 10:19 | 显示全部楼层
Hql代码  
select t.d,c,sum(c) from (select date(receiveTime) d, count(user.uid) c from OnlineAwards where receiveTime is not null group by user.uid,date(receiveTime)) t where t.c = 2  

select t.d,c,sum(c) from (select date(receiveTime) d, count(user.uid) c from OnlineAwards where receiveTime is not null group by user.uid,date(receiveTime)) t where t.c = 2  

gz-vps 发表于 2011-7-21 10:19 | 显示全部楼层
从来都不用hibernate做复杂sql处理,用类似于ibatis的那种sql mapping...

不知道有其他什么方法么?

已经来了吗 发表于 2011-7-21 10:19 | 显示全部楼层
我现在就是在烦这个问题,类似于汇总这类查询数量不多,但是又无法用hql 又不想去破坏orm格局。

fossil 发表于 2011-7-21 10:19 | 显示全部楼层
难道没有人遇到过这类问题么?

木已 发表于 2011-7-21 10:20 | 显示全部楼层
  
public static final String SQL =   
            "SELECT trunc(t.xxxxxxx) AS 日期,\n" +   
                    "       SUM(t.xxxxxxxx * t.xxxxxxxxx) AS 总价,\n" +   
                    "       SUM(t.xxxxxxxxxxxxx) AS 总数,\n" +   
                    "       SUM(t.xxxxxxxxx * t.xxxxxxxxx) / SUM(t.xxxxxxxxx) AS 均价\n" +   
                    "  FROM xxxxxxxxxxxxxx t\n" +   
                    " WHERE t.xxxxxxxx = ?\n" +   
                    "   AND t.xxxxxxxxxxx >=\n" +   
                    "       ?\n" +   
                    "   AND t.xxxxxxxxxx <=\n" +   
                    "       ?\n";   
  
  
    public List<Map<String, Object>> find(String type1, Date beginDate, Date endDate) {   
        List<Object> params = new ArrayList<Object>();   
  
        params.add(type1);   
        params.add(beginDate);   
        params.add(endDate);   
  
        Object[] values = params.toArray(new Object[params.size()]);   
  
        if (log.isDebugEnabled()) {   
            log.debug("===========> sql: " + SQL);   
            log.debug("===========> values: " + ArrayUtils.toString(values));   
        }   
  
        return findBySQLQuery(SQL, values);   
    }   
      
    public List<Map<String, Object>> findBySQLQuery(final String sql, final Object[] values) {   
        return (List<Map<String, Object>>) (getHibernateTemplate().executeWithNativeSession(   
                new HibernateCallback() {   
  
                    @Override  
                    public Object doInHibernate(Session session) throws  
                            HibernateException {   
                        Query query = session.createSQLQuery(sql)   
                                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);   
  
                        if (values != null) {   
                            for (int i = 0; i < values.length; i++) {   
                                query.setParameter(i, values[i]);   
                            }   
                        }   
                        List results = query.list();   
                        return results;   
                    }   
                }));   
    }  

public static final String SQL =
            "SELECT trunc(t.xxxxxxx) AS 日期,\n" +
                    "       SUM(t.xxxxxxxx * t.xxxxxxxxx) AS 总价,\n" +
                    "       SUM(t.xxxxxxxxxxxxx) AS 总数,\n" +
                    "       SUM(t.xxxxxxxxx * t.xxxxxxxxx) / SUM(t.xxxxxxxxx) AS 均价\n" +
                    "  FROM xxxxxxxxxxxxxx t\n" +
                    " WHERE t.xxxxxxxx = ?\n" +
                    "   AND t.xxxxxxxxxxx >=\n" +
                    "       ?\n" +
                    "   AND t.xxxxxxxxxx <=\n" +
                    "       ?\n";


    public List<Map<String, Object>> find(String type1, Date beginDate, Date endDate) {
        List<Object> params = new ArrayList<Object>();

        params.add(type1);
        params.add(beginDate);
        params.add(endDate);

        Object[] values = params.toArray(new Object[params.size()]);

        if (log.isDebugEnabled()) {
            log.debug("===========> sql: " + SQL);
            log.debug("===========> values: " + ArrayUtils.toString(values));
        }

        return findBySQLQuery(SQL, values);
    }
       
        public List<Map<String, Object>> findBySQLQuery(final String sql, final Object[] values) {
        return (List<Map<String, Object>>) (getHibernateTemplate().executeWithNativeSession(
                new HibernateCallback() {

                    @Override
                    public Object doInHibernate(Session session) throws
                            HibernateException {
                        Query query = session.createSQLQuery(sql)
                                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

                        if (values != null) {
                            for (int i = 0; i < values.length; i++) {
                                query.setParameter(i, values[i]);
                            }
                        }
                        List results = query.list();
                        return results;
                    }
                }));
    }

数据库移植是瞎扯淡,就像一次编码到处运行一样。

秋秋 发表于 2011-7-21 10:20 | 显示全部楼层
你说的hql不能处理主要是因为不能子查询吗?可以考虑试下criteria
但是不知道支不支持from后的子句~~~~

紫衿 发表于 2011-7-21 10:20 | 显示全部楼层
droopy


数据库移植是瞎扯淡,就像一次编码到处运行一样。



额, 你打的这些和我说的好像没有关系 createSQLquery 这个我知道

问题是 ORM破坏了。

数据库移植是瞎扯淡这句话是对的,但是有的软件确实是可以适应多数据库 我想知道他们是怎么办到的
一步一步的写查询还是 忠实于HQL?

 楼主| 楠楠 发表于 2011-7-21 10:20 | 显示全部楼层
某开源项目(RHQ),遇到这种问题也是纯sql的,跨数据库,是先判断数据库类型,然后每种写一个sql

愚人 发表于 2011-7-21 10:20 | 显示全部楼层
看来 数据库移植 不过是浮云尔。。。


有烟没火 发表于 2011-7-26 12:15 | 显示全部楼层
非常感谢楼主,楼主万岁万岁万万岁!
江南枫 发表于 2011-8-1 10:49 | 显示全部楼层
越办越好~~~~~~~~~`
郁闷小男人 发表于 2011-8-4 12:08 | 显示全部楼层
额~哦........偶无语
fl 发表于 2011-8-7 11:18 | 显示全部楼层
不错!!!!!!!!!!!!!1
曾经的小孩 发表于 2011-8-11 14:54 | 显示全部楼层
楼主工作顺利,继往开来!
有烟没火 发表于 2011-8-15 09:29 | 显示全部楼层
非常感谢楼主,楼主万岁万岁万万岁!
feiguo 发表于 2011-8-17 12:37 | 显示全部楼层
挺好啊!!!!!!!!!!!!!!!
jinchang 发表于 2011-8-17 12:38 | 显示全部楼层
疯了 这年头盗版还真多~~~~~~
有烟没火 发表于 2011-8-18 14:01 | 显示全部楼层
呵呵 你想就来嘛~~
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-28 21:55 , Processed in 0.169867 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表