hibernate中使用sql返回结果转为非持久化对象

以前处理复杂逻辑时,使用过几种不同的方法,但是今天发现了一个hibernate中使用sql更方便的方法,前提是hibernate必须是3.2或者以上版本,废话不说了,下面看介绍:

普通的实体JavaBean(请注意,这个javabean不需要持久化,就是一个普通的JavaBean,只需要将数据库返回的字段对象上,有set、get方法即可,要求属性名称都变为大写,因为返回的结果字段都是默认大写的,为了对应上javabean的属性)代码如下:

-------------------------------------------------------------------------------

public class ordercount {
 private String PHONENAME;
 privateInteger   ORDERCOUNT;
 privateInteger   KEHUCOUNT;
 privateInteger   ORDERALLCOUNT;
 privateInteger   ORDERWANCHENG;
 privateInteger   ORDERTUIDING;

 public String getPHONENAME() {
  return PHONENAME;
 }

 public void setPHONENAME(String phonename){
  PHONENAME = phonename;
 }

 public Integer getORDERCOUNT() {
  return ORDERCOUNT;
 }

 public void setORDERCOUNT(Integer ordercount){
  ORDERCOUNT = ordercount;
 }

 public Integer getKEHUCOUNT() {
  return KEHUCOUNT;
 }

 public void setKEHUCOUNT(Integer kehucount){
  KEHUCOUNT = kehucount;
 }

 public Integer getORDERALLCOUNT() {
  return ORDERALLCOUNT;
 }

 public void setORDERALLCOUNT(Integerorderallcount) {
  ORDERALLCOUNT =orderallcount;
 }

 public Integer getORDERWANCHENG() {
  return ORDERWANCHENG;
 }

 public void setORDERWANCHENG(Integerorderwancheng) {
  ORDERWANCHENG =orderwancheng;
 }

 public Integer getORDERTUIDING() {
  return ORDERTUIDING;
 }

 public void setORDERTUIDING(Integerordertuiding) {
  ORDERTUIDING =ordertuiding;
 }

 
}

 

业务逻辑代码如下:

-----------------------------代码如下---------------------------------------

//较为复杂的sql,注意返回的字段名称都是大写的

 String  sql= " selectt.phonename as  PHONENAME, (select count(*)"
         + "  from g3_phonescan p "
         + "  where p.telephoneid = t.telephoneid) asORDERCOUNT, "
         + "  select  count(distinct(e.mobile)) "
         + "  from g3_phonescan e "
         + "   where e.telephoneid =t.telephoneid   )as  KEHUCOUNT, "
         + "  (select count(w.orderid) from g3_goodsw  where w.telephoneid=t.telephoneid)as  ORDERALLCOUNT, "
         + "  (select count(w.orderid) from g3_goodsw  where w.telephoneid=t.telephoneid andw.state=4)  as  ORDERWANCHENG,"
         + "   (select count(w.orderid)from g3_goods w  where w.telephoneid=t.telephoneidand w.state=7) as  ORDERTUIDING"
         + "  from g3_telephone t";

//生成SQLQuery 对象,请注意是:SQLQuery,不是Query(一定不能错,因为Query没有addScalar方法)

  SQLQuery query =this.getSession().createSQLQuery(sql);

//为每个sql中的查询的字段设置返回的类型,当然这个地方那个不设置也可以,不过如果结果出现返回count()函数的字段就不需设置,不然会报错,最好这个地方还是设置一下类型

  query.addScalar("PHONENAME", neworg.hibernate.type.StringType());
  query.addScalar("ORDERCOUNT",new org.hibernate.type.IntegerType());
  query.addScalar("KEHUCOUNT",new org.hibernate.type.IntegerType());
  query.addScalar("ORDERALLCOUNT",new org.hibernate.type.IntegerType());
  query.addScalar("ORDERWANCHENG",new org.hibernate.type.IntegerType());
  query.addScalar("ORDERTUIDING",new org.hibernate.type.IntegerType());
 //设置返回的结果集字段映射的java实体(注意这个java实体类是普通的JavaBean,不需要持久化,这也正是我认为的方便之处)
  List<ordercount> orderlist = query.setResultTransformer(Transformers.aliasToBean(ordercount.class)).list();

 

以下为JSP页面用标签获取数据,代码如下:

---------------------------------------------------------------------

<s:iteratorvalue="ordercountlist">
    <tr>
     <td><s:propertyvalue="PHONENAME"/></td>
     <td><s:propertyvalue="ORDERCOUNT"/></td>
     <td><s:propertyvalue="KEHUCOUNT"/></td>
     <td><s:propertyvalue="ORDERALLCOUNT"/></td>
     <td><s:propertyvalue="ORDERWANCHENG"/></td>
     <td><s:propertyvalue="ORDERTUIDING"/></td>
    </tr>
   </s:iterator>

以上就是所有的代码了,呵呵 我感觉真的是太方便了,以后再碰到复杂的业务逻辑就这样用,很方便!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值