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的数据,因 ...
随机推荐
- cookies和re
参考:http://cuiqingcai.com/968.html http://cuiqingcai.com/977.html
- [CSS]第一项和最后一项样式
列表项的第一项距离顶部0.2rem,最后一项距离底部0.5rem .item:first-child { padding-top: .2rem; } .item:last-child { paddin ...
- 工作随笔——自动重发的凶手--feign
公司使用的feign(https://github.com/OpenFeign/feign)作为http客户端. 开发时debug后端程序,发现同一个请求会多次收到. 为了判断是谁在搞鬼,在客户端和服 ...
- DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)
最近花了点时间把<破坏之王-DDOS攻击与防范深度剖析>看了一遍,坦白来说,这本书比较浅显,可以说是入门书,当然对于我这种对DDOS一知半解的人来说,也是一本不错的书,起码我 ...
- 【python】函数说明文档
- Linux文件系统概述
Unix文件是以字节序列组成的信息载体(container),内核不解释文件的内容. Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有系统的结构,所有Linux用户和程序 ...
- 深入理解java虚拟机_前言
2.JVM虚拟机 2.1 概述 java获得广泛认可主要是因为: (1) java是一门结构严谨.面向对象的编程语言; (2) java摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想; ...
- C++11新语法糖之尾置返回类型
C++11的尾置返回类型初衷是为了方便复杂函数的声明和定义,但是当复杂度稍微提升一些的时候很明显能注意到这种设计的作用微乎其微. 首先考虑如下代码: C++ //返回指向数组的指针 auto func ...
- python各种类型的转换
#进制转换 ord(x) #将一个字符转换为它的整数值 hex(x) #将一个整数转换为一个十六进制字符串 oct(x) #将一个整数转换为一个八进制字符串 #类型转换int(x [,base ]) ...
- [经验分享]WebApi+SwaggerUI 完美展示接口
不喜欢说废话,直接上干货. 第一步: 打开VS IDE ,新建一个WebAPI项目 选择Web .Net FrameWork (如果喜欢使用.Net Core的可以使用.Net Core) 选择Web ...