hibernate使用setResultTransformer()将SQL查询结果放入集合中
@Entity
@Table(name="T_BILL_ACCT_ITEM")
@NamedQuery(name="TBillAcctItem.findAll", query="SELECT t FROM TBillAcctItem t")
public class TBillAcctItem implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="ACCT_ITEM_ID")
private long acctItemId; @Column(name="ACCT_ID")
private long acctId; @Column(name="BILLING_CYCLE_ID")
private String billingCycleId; @Column(name="PRODUCT_ID")
private String productId; @Column(name="SERVICE_ID")
private String serviceId; @Column(name="ACCT_ITEM_CODE")
private String acctItemCode; @Column(name="ORIGINAL_AMOUNT")
private int originalAmount; @Column(name="CDR_DISCOUNT")
private int cdrDiscount; @Column(name="ACCT_DISCOUNT")
private int acctDiscount; @Column(name="RECE_AMOUNT")
private int receAmount; @Column(name="REAL_AMOUNT")
private int realAmount; @Column(name="CHARGE_OFF_SOURCE")
private int chargeOffSource; @Column(name="STATE")
private int state;
但是我现在需要查询出来的信息是这样的一个pojo类:(因为int类型的值不能为空,所以我需要将字段定义为 java.long.Integer类型)
public class ProductBillInfo implements Serializable{
private static final long serialVersionUID = 1L;
private String productId;//产品标识
private String serverId;//服务标示
private Integer realAmount;//实收金额(sum求和)
private Integer receAmount;//应收金额(sum求和)
private int state;//账目状态
private String billingCycle;//账期(月)
因为hibernate要查询的对象是要和表结构一一映射的,现在求和字段这些个是映射不了的, 之前的方法就有问题了。 找了很多看了hibernate的API 找到这个东西。 如下:
StringBuffer b = new StringBuffer();
//... 省略SQL拼接代码
String sql = b.toString();
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("productId", StandardBasicTypes.STRING);//要查询出来的字段、类型
List<ProductBillInfo> lnfo =query.list();
下面是我用到的查询pojo的方法中的实现:
@SuppressWarnings("unchecked")
public List<ProductBillInfo> findByAcctIdAndCycle1(long acctId,
String cycleBegin, String cycleEnd, int state){
List<String> cycles = DateUtil.getAllCycle(cycleBegin, cycleEnd);
StringBuffer buf = new StringBuffer();
buf.append("select t.PRODUCT_ID as productId , t.SERVICE_ID as serviceId ," +
"sum(t.REAL_AMOUNT) as realAmount ,sum(t.RECE_AMOUNT) as receAmount ," +
"t.STATE as state ,t.BILLING_CYCLE_ID as billingCycleId " +
" from T_BILL_ACCT_ITEM t where t.STATE= '" + state + "' AND t.ACCT_ID='" + acctId + "' AND t.BILLING_CYCLE_ID in (");
StringBuffer bf = new StringBuffer();
for(String id : cycles){
if(bf.toString().equals("")){
bf.append("'"+id+"'");
} else{
bf.append(","+"'"+id+"'");
}
}
buf.append(bf.toString());
buf.append(") GROUP BY t.PRODUCT_ID,t.BILLING_CYCLE_ID,t.SERVICE_ID");
SQLQuery query = getSession().createSQLQuery(buf.toString());
query.addScalar("productId", StandardBasicTypes.STRING);
query.addScalar("serviceId", StandardBasicTypes.STRING);
query.addScalar("realAmount", StandardBasicTypes.INTEGER);
query.addScalar("receAmount", StandardBasicTypes.INTEGER);
query.addScalar("state", StandardBasicTypes.INTEGER);
query.addScalar("billingCycleId", StandardBasicTypes.STRING);
query.setResultTransformer(Transformers.aliasToBean(ProductBillInfo.class));
List<ProductBillInfo> lnfo =query.list();
return lnfo;
}
注:示例中addScalar及setResultTransformer很关键,我在使用的时候还报了一个错(原因是在实体中需要有一个无参构造函数),否则错误如下:
org.hibernate.HibernateException: Could not instantiate resultclass:com.eastelsoft.framework.formbean.interfaceBean.ProductBillInfo
public static void main(String[] args) {
List<String> c = new ArrayList<String>();
c.add("1");c.add("2");c.add("3");
StringBuffer bf = new StringBuffer();
for(String id : c){
if(bf.toString().equals("")){
bf.append("'"+id+"'");
} else{
bf.append(","+"'"+id+"'");
}
}
System.out.println(bf.toString());
}
打印结果是: '1','2','3'
hibernate使用setResultTransformer()将SQL查询结果放入集合中的更多相关文章
- 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
- java集合-把商品放入集合中调用(新手)
//创建的一个包名. package qige; //导入的一个包.import java.util.*; //定义一个类.public class Ipcs { //公共静态的主方法. public ...
- java通过文件路径读取该路径下的所有文件并将其放入list中
java通过文件路径读取该路径下的所有文件并将其放入list中 java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中.假设指定路径为path,目标集合为fileList,遍 ...
- 用SQL查询方式显示GROUP BY中的TOP解决方法[转]
用SQL查询方式显示GROUP BY中的TOP怎样用一个SQL语句来显示 分组后每个组的前几位 比如把一个学校所有学生的成绩按班级分组,再显示每个班级前五名的信息. 班级 学生 成绩 一班 ...
- tuple放入dict中
tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...
- 用MT.exe将exe中的manifest文件提取出来和将manifest文件放入exe中
前一种方法是将manifest文件放入exe中,但是要记得需要在工程中设置 这样的话exe中就不存在manifest了,在debug目录下就会看到相应的manifest文件.后者是将exe中的man ...
- pyqt字符串分离开,放入列表中
string1 = ''''' the stirng Has many line In THE fIle ''' list_of_string = string1.split() print list ...
- .Net中把图片等文件放入DLL中,并在程序中引用
原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵 ...
- MyBatis 遍历数组放入in中
必须要遍历出数组的值放入in中 如果直接将"'2','3','4','5','6','7','8'" 字符串放入in中,只会查出 inv_operate_type的值为2的数据,因 ...
随机推荐
- 【CODEFORCES】 A. Dreamoon and Sums
A. Dreamoon and Sums time limit per test 1.5 seconds memory limit per test 256 megabytes input stand ...
- 对使用多个swiper下标有时显示不出来的问题
这久写了一个网页,其中有很多的轮播图及tab页面切换,就使用了swiper框架,有时一个网页要用到6-8个,如此就出现了下图这种问题: 有时刷新看不到,有时又能看到,tab切换过去的页面也看不到,其实 ...
- JAVA入门[18]-JdbcTemplate简单实例
一.关于JdbcTemplate JdbcTemplate是最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询. Spring数据访问模板:在数据库操作 ...
- Elasticsearch和MongoDB分片及高可用对比
本文旨在对比Elasticsearch和MongoDB高可用和分片的实现机制. Elasticsearch ES天生就是分布式的,那她又是如何做到天生分布式的? 通过ES官方指南我们可以知道: 一个运 ...
- 青否云 - 小程序待办事项 wxapp开源系统
青否云最新开源系统:小程序待办事项 wxapp-demo 青否云 小程序 demo 下载地址:https://github.com/qingful/wxapp-demo 官网 http://cloud ...
- 为什么还坚持.NET? 找一门适合自己的语言去做编程
为什么还坚持.NET? 找一门适合自己的语言去做编程 接触了.NET快十二年了,现在专注于分布式服务的开发. 中间经历过各种编程语言的诱惑,ios等. 前几年才对自己有比较明确的定位 技术上:找到适合 ...
- 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据
§ 封装网络请求及 mock 数据 本文配套视频地址: https://v.qq.com/x/page/i05544fogcm.html 开始前请把 ch2-3 分支中的 code/ 目录导入微信开发 ...
- js 数组的常用方法归纳
数组的常用方法归纳 slice(start,end) 传参:start代表从哪里开始截取,end代表截取结束的地方 var a = [1,2,3]a.slice(1);//[2,3] pop() 可以 ...
- ERROR: ORA-12560: TNS: 协议适配器错误,解决办法:启动OracleServiceORCL服务
- ConcurrentDictionary内部函数的使用说明
AddOrUpdate(...)函数的使用: private static ConcurrentDictionary<long, string> condic = new Concurre ...