一张收支记录表:InExRecord
两个字段:
type:收支类型,其值可以是"收入","支出"和"无";
money:就是金额;下面这条语句就是求出这张收支记录表的 总收入,总支出,和总结余;SELECT a.flowin, b.flowout, a.flowin-b.flowout
FROM
(SELECT SUM(record.money) AS flowin FROM InExRecord AS record WHERE type="收入")a,
(SELECT SUM(record.money) AS flowout FROM InExRecord AS record WHERE type="支出")b;这条语句直接做为SQL在数据库上运行是没问题,但做为HQL解析通不过。
现在已知的解决方法有两个:
1.拆成两条HQL语句执行;
2.通过Session里的Cnnection,直接运行SQL语句;
我就想问下能否直接使用HQL支持这类相对比较复杂的,使用了临时表的语句,不用考虑效率问题,因为不是常用操作。

解决方案 »

  1.   

    忘了着色,再贴一次。SELECT a.flowin, b.flowout, a.flowin-b.flowout 
    FROM 
    (SELECT SUM(record.money) AS flowin FROM InExRecord AS record WHERE type="收入")a, 
    (SELECT SUM(record.money) AS flowout FROM InExRecord AS record WHERE type="支出")b; 
      

  2.   

    可以考虑用cretia接口一个个add
    子查询不要分开来,那就是2个hql了....
    where type = :type
    下面set进去
    得到结果放到list里面
    然后外面直接套用接口查.
    ==========================
    hql分开来很麻烦的...特别是你这种从结果集里面查还定义别名的....
    实在不行就用createsqlquery直接打sql吧
      

  3.   

    设计一个类InExRecord,表示存储的条目,和InExRecord表里的每条记录对应,你需要写hibernate配置文件把这个类和InExRecord表映射起来package com.myaccount;public class InExRecord{
    //类型,是"存钱"或"取钱"
    private String type; //金额
    private int money;        //下面是构造方法,和get、set方法
    }
    然后,设计Statistic类,作为统计类,这个类不要做hibernate映射package com.myaccount;public class Statistic {
    //总收入金额
    private long in; //总支出金额
    private long out; //余额
    private long balance;        //下面是构造方法,和get、set方法
    }
    然后HQL就是:String hql = "select new com.myaccount.Statistic("
    + "sum(r.money) from InExRecord r where r.type='收入', "
    + "sum(r.money) from InExRecord r where r.type='支出'"
    + ")";
      

  4.   

    刚才忘了,Statistic类必须要有一个构造方法:public Statistic(long in, long out){
        this.in = in;
        this.out = out;
        this.balance = in - out;
    }hql里的那个new xxx 语句就是调用这个构造器
      

  5.   

    使用Criteria,可以对任意一个字段作查询

    criteria.add(Restrictions.eq(field, equalValue));field:字段(任意一个)
    eq:等于(between)
    equalValue:字段中的值
    比如你想查type="收入"
    criteria.add(Restrictions.eq(type, "收入"));
    再加一条过滤:
    criteria.add(Restrictions.eq(money, "1000"));
    再加...
      

  6.   

    To finalzhzhk
    radeonxhl提供的这条HQL我没试过,但从结构上我猜想在执行时会被Hibernate拆分成两条SQL语句吧?然后得到的结果再用于构造Statistic对象。
    To finalzhzhk我知道Criteria在定制查询条件方面很灵活,但我还没看出来如何用Criteria在构造我所需要的HQL语句叱?
      

  7.   

    To radeonxhlradeonxhl提供的这条HQL我没试过,但从结构上我猜想在执行时会被Hibernate拆分成两条SQL语句吧?然后得到的结果再用于构造Statistic对象。To finalzhzhk我知道Criteria在定制查询条件方面很灵活,但我还没看出来如何用Criteria在构造我所需要的HQL语句叱?
      

  8.   

    发现原来的hql是错的,那样应该是不能运行的
    String hql = "select new com.myaccount.Statistic(" 
        + "sum(r.money) from InExRecord r where r.type='收入', " 
        + "sum(r.money) from InExRecord r where r.type='支出'" 
        + ")"; 
    想了一下,应该这样改:
    设计一个TypeRecord类public class TypeRecord{
    private long money; private String type; public TypeRecord(String type, long money) {
    this.money = money;
    this.type = type;
    }
    }
    然后hql应该是String hql = "select new TypeRecord(" 
     + "r.type, sum(r.money)" 
    + ") from InExRecord r group by r.type"; 
    这样会查询出两条,一条是支出的TypeRecord,另一条是收入的TypeRecord
    根据这两个对象自己再组合成Statistic这样应该是可行的,但好像还是没有解决lz的问题啊,呵呵
      

  9.   

    一张收支记录表:InExRecord 
    两个字段: 
    type:收支类型,其值可以是"收入","支出"和"无"; 
    money:就是金额; 下面这条语句就是求出这张收支记录表的 总收入,总支出,和总结余; SELECT a.flowin, b.flowout, a.flowin-b.flowout 
    FROM 
    (SELECT SUM(record.money) AS flowin FROM InExRecord AS record WHERE type="收入")a, 
    (SELECT SUM(record.money) AS flowout FROM InExRecord AS record WHERE type="支出")b; 这条语句直接做为SQL在数据库上运行是没问题,但做为HQL解析通不过。 
    现在已知的解决方法有两个: 
    1.拆成两条HQL语句执行; 
    2.通过Session里的Cnnection,直接运行SQL语句; 
    我就想问下能否直接使用HQL支持这类相对比较复杂的,使用了临时表的语句,不用考虑效率问题,因为不是常用操作。 
     
     
      

  10.   

    呵呵..昨天研究了一天,查了不少资料,好像现在的Hbiernate真的还做不到这样的查询~`
      

  11.   

    楼主可以先把你那个复杂的sql建成一个视图,然后生成这个视图的映射文件应该可以解决这种问题,还有一种方法就是直接用 Query query=this.getSession().createSQLQuery(sql);这种方式