一张收支记录表: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支持这类相对比较复杂的,使用了临时表的语句,不用考虑效率问题,因为不是常用操作。
两个字段:
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支持这类相对比较复杂的,使用了临时表的语句,不用考虑效率问题,因为不是常用操作。
解决方案 »
- 引用真的都非配在栈内存中吗?
- SwingWorker 问题
- 求助!区别字符串是整数,小数,还是字母
- 关于List的add()方法编译器报警的问题(jdk1.5)
- 一道java程序员试题求解
- 怎么在应用程序中加入音乐效果?
- 在linux下面运行java程序,怎么老是报找不到class的错呢?Exception in thread "main" java.lang.NoClassDefFoundError:
- servlet的一个问题
- 我要做打印表格的程序,但是表格有好几种类型,我该如何做,我对java打印不熟悉请赐教(100)
- -----------请问各位,有没有用JBUILDER操作数据库的实例原码,不是用组件-------时刻在线等待!!!------
- 货币组合问题
- java中有没有静态数组??
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个hql了....
where type = :type
下面set进去
得到结果放到list里面
然后外面直接套用接口查.
==========================
hql分开来很麻烦的...特别是你这种从结果集里面查还定义别名的....
实在不行就用createsqlquery直接打sql吧
//类型,是"存钱"或"取钱"
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='支出'"
+ ")";
this.in = in;
this.out = out;
this.balance = in - out;
}hql里的那个new xxx 语句就是调用这个构造器
例
criteria.add(Restrictions.eq(field, equalValue));field:字段(任意一个)
eq:等于(between)
equalValue:字段中的值
比如你想查type="收入"
criteria.add(Restrictions.eq(type, "收入"));
再加一条过滤:
criteria.add(Restrictions.eq(money, "1000"));
再加...
radeonxhl提供的这条HQL我没试过,但从结构上我猜想在执行时会被Hibernate拆分成两条SQL语句吧?然后得到的结果再用于构造Statistic对象。
To finalzhzhk我知道Criteria在定制查询条件方面很灵活,但我还没看出来如何用Criteria在构造我所需要的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的问题啊,呵呵
两个字段:
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支持这类相对比较复杂的,使用了临时表的语句,不用考虑效率问题,因为不是常用操作。