sqlpdf转化为wordhql

hibernate中使用sql返回结果转为非持久化对象
以前处理复杂逻辑时,使用过几种不同的方法,但是今天发现了一个hibernate中使用sql更方便的方法,前提是hibernate必须是3.2或者以上版本,废话不说了,下面看介绍:
普通的实体JavaBean(请注意,这个javabean不需要持久化,就是一个普通的JavaBean,只需要将数据库返回的字段对象上,有
set、get方法即可,要求属性名称都变为大写,因为返回的结果字段都是默认大写的,为了对应上javabean的属性)代码如下:
-------------------------------------------------------------------------------
public class ordercount {
&private String PHONENAME;
Integer&& ORDERCOUNT;
Integer&& KEHUCOUNT;
Integer&& ORDERALLCOUNT;
Integer&& ORDERWANCHENG;
Integer&& ORDERTUIDING;
&public String getPHONENAME() {
&&return PHONENAME;
&public void setPHONENAME(String phonename)
&&PHONENAME =
&public Integer getORDERCOUNT() {
&&return ORDERCOUNT;
&public void setORDERCOUNT(Integer ordercount)
&&ORDERCOUNT =
&public Integer getKEHUCOUNT() {
&&return KEHUCOUNT;
&public void setKEHUCOUNT(Integer kehucount)
&&KEHUCOUNT =
&public Integer getORDERALLCOUNT() {
&&return ORDERALLCOUNT;
&public void setORDERALLCOUNT(Integer
orderallcount) {
&&ORDERALLCOUNT =
&public Integer getORDERWANCHENG() {
&&return ORDERWANCHENG;
&public void setORDERWANCHENG(Integer
orderwancheng) {
&&ORDERWANCHENG =
&public Integer getORDERTUIDING() {
&&return ORDERTUIDING;
&public void setORDERTUIDING(Integer
ordertuiding) {
&&ORDERTUIDING =
业务逻辑代码如下:
-----------------------------代码如下---------------------------------------
//较为复杂的sql,注意返回的字段名称都是大写的
&String& sql= " select
t.phonename as& PHONENAME, (select count(*)
+ "& from g3_phonescan p "
+ "& where p.telephoneid = t.telephoneid) as
ORDERCOUNT, "
select& count(distinct(e.mobile)) "
+ "& from g3_phonescan e "
+ "&& where e.telephoneid =
t.telephoneid&& )
as& KEHUCOUNT, "
+ "& (select count(w.orderid) from g3_goods
w& where w.telephoneid=t.telephoneid)
as& ORDERALLCOUNT, "
+ "& (select count(w.orderid) from g3_goods
w& where w.telephoneid=t.telephoneid and
w.state=4)& as& ORDERWANCHENG,
+ "&& (select count(w.orderid)
from g3_goods w& where w.telephoneid=t.telephoneid
and 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", new
org.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:iterator
value="ordercountlist"&
&&&&&&td&&s:property
value="PHONENAME"
&&&&&&td&&s:property
value="ORDERCOUNT"
&&&&&&td&&s:property
value="KEHUCOUNT"
&&&&&&td&&s:property
value="ORDERALLCOUNT"
&&&&&&td&&s:property
value="ORDERWANCHENG"
&&&&&&td&&s:property
value="ORDERTUIDING"/&
&&&&/s:iterator&
以上就是所有的代码了,呵呵&
我感觉真的是太方便了,以后再碰到复杂的业务逻辑就这样用,很方便!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。[极品难]关于hibernate如何把原生sql查出的结果转化为对象
[问题点数:20分,结帖人limaoyuan]
[极品难]关于hibernate如何把原生sql查出的结果转化为对象
[问题点数:20分,结帖人limaoyuan]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。当前位置: >
> Hibernate之SQL查询—实体查询,并将查询结果集转化成非持久化实体(即普通javaBean
Hibernate之SQL查询—实体查询,并将查询结果集转化成非持久化实体(即普通javaBean
pengwei521 & at
Hibernate 之SQL查询—实体查询,并将查询结果集转化成非持久化实体(即普通javaBean)
  方法:利用Query接口的setResultTransformer()方法
  条件:只要该普通javaBean提供setter与getter方法即可
  Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
String queryString = "select a.user, b.dept from user a, dept b where a.deptid=b.deptid";
List list = session.createSQLQuery(queryString).setResultTransformer(Transformers.aliasToBean(PojoBean.class)).list();
session.close();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
PojoBean bean = (PojoBean) iterator.next();
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-hibernate分组统计与聚合查询(原生sql和使用case when then else end的hql)【转】 -
- ITeye技术网站
博客分类:
之前在弄一个经过公司框架改装后的SSH项目,碰到了不少悲催的问题。。
项目是公司的内部信息化系统,十多年来经手千千万万人的OA办公系统。里面的代码已经面目全非。
因为hibernate里面是没有数据库函数东西的,所以类似decode这类函数和left join...on...(hibernate不支持on关键字),这些都有心无力了。
具体用法百度百科有。
解释如下:
DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode
函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then
配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。
不过该函数只能在Oracle里面用。。
回归正题,Oracle不能用数据库的函数,要么就使用纯SQL,session.createSQLQuery ,sqlQuery
那些来直接执行sql查询。
不过貌似还有一种方法就是通过 hibernate.query.substitutions 将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字)。这方法没用过。因为公司框架去掉了hibernate的包,封装成自己的了,好多方法没的没了,变形的变形了。
最后解决方案:
hibernate hql查询,使用case when then else end
select t.c1,t.c2,sum(case when t.status=0 then t.c3 else 0 end) group by t.c1,t.c2 .......
查询t表,对t表进行分组统计,判断 when 后面 then前面的表达式是否成立,成立返回 then 后面的,否则返回else后面的。end提示结束。。
when...then... 可以多次嵌套进去使用。
浏览: 27839 次
来自: 广州
&s:iterator value=&{'1' ...
你的JS脚本用不了,我改成:document.getEleme ...
原来是这样子的啊还是饿汉式比较好,不会出现多线程中的不单例情 ...您现在的位置:&&>>&&>>&&>>&正文
教你如何利用JAVACC将HQL转换为SQL
  主要是为了尝试一下JAVACC,利用编译原理的思路构造自己的语言:)    首先到https://javacc.dev.java.net/ JAVACC的老家JAVACC    我们今天的目标就是把from Teacher转化为select * from Teacher    首先编写.jj文件    1.定义要空开的分隔符  java代码:      SKIP :  {   " "  | "\t"  | "\n"  | "\r"  | "\f"  }      2.定义关键字。from 为HQL的关键字,Teacher是用户输入的类名,应当是一个任意由字母和数字组成的单词,我们可以用正则表达式:["A"-"Z","a"-"z","0"-"9"]来表示。    java代码:      TOKEN: /*RESERVED TOKENS FOR UQL */  {    &FROM:"from"&    | &FROM_OBJECT:(["A"-"Z","a"-"z","0"-"9"])+ & //自己替换[]  }      3.接下来定义一下输入的顺序与规范  java代码:      void expression() :  {  Token tT  }  {  (   &FROM&   tTable = &FROM_OBJECT&  )  {   sqlSB.append("SELECT *");   sqlSB.append(" FROM ").append(tTable.image);  }  }      最后就是写解析代码,以便生成java代码    java代码:      PARSER_BEGIN(HQLParser)    import java.lang.StringB  import java.io.StringR  import java.io.R    public class HQLParser {      private static StringBuffer sqlSB;    /**   A String based constructor for ease of use.   **/    public HQLParser(String s)    {      this((Reader)(new StringReader(s)));  sqlSB = new StringBuffer();    }      public String getSQL()    {      return sqlSB.toString();    }      public static void main(String args[])//自己替换[]    {      try      {         String query = args[0];//自己替换[]         HQLParser parser = new HQLParser(query);      parser.parse();         System.out.println("SQL:"+parser.getSQL());      }      catch(Exception e)      {         e.printStackTrace();      }    }      public void parse()    {  try  {     expression();  }  catch(Exception e)      {        e.printStackTrace();      }    }  }  PARSER_END(HQLParser)      接下来到dos下输入:  引用:    javacc -debug_parser test.jj    -debug_parser:用来输出语法树      这时候会生成7个java文件,每个文件的作用以后会详细说明    这时候只需要    javac *.java即可编译全部的java文件    然后执行java HQLParser “from Teacher“    这时候屏幕上就会显示出“select * from Teacher“    
【责编:admin】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 Java 频道导航}

我要回帖

更多关于 hql sql 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信