Hibernate调优之select new map().doc_第1页
Hibernate调优之select new map().doc_第2页
Hibernate调优之select new map().doc_第3页
Hibernate调优之select new map().doc_第4页
Hibernate调优之select new map().doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate调优之select new map() 分类: Hibernate 2013-07-19 21:42 6756人阅读 评论(24) 收藏 举报 Hibernate调优不只是设置一下lazy,调整一下由谁来维护这个字段而已。 这次要说的是对查询语句进行优化select new map()。 select new map语句结果说明。 语句一: String hql=“select from Student s”; List ls=session.createQuery(hql).list(); for(String obj:ls) System.out.pringln(obj0); 结果list中,每条记录对应一个object数组,object中每个元素为hql语句中列的序号(从0开始)。 语句二: String hql=“select new map() from Student s”; List ls=session.createQuery(hql).list(); for(Map m:ls) System.out.pringln(m.get(0); 结果list中,每条记录对应一个map,map中key为hql语句中的序号,从0开始,key为字符,非数字。 语句三: String hql=“select new map( as name) from Student s”; List ls=session.createQuery(hql).list(); for(Map m:ls) System.out.pringln(m.get(name); 结果list中,每条记录对应一个map,map中key为hql语句中的别名。 详解map 此处的map对应的是JDK中的HashMap。 个人理解是Hibernate在对此hql语句解析的时候,遇到map这个关键字,然后将后面的列作为值,别名作为键(若无别名,则用数字代替)存入到一个HashMap中。具体的代码没有看,谁有兴趣找到那段代码了发一下。 详解select new map的效率 我第一眼看到这个代码,第一感觉是这样降低了效率。因为涉及到对字段的分析。并且认为map不是jdk的map而是hibernate中mapping的那个map。 而mapping中的map只有一个构造函数new Map(PersistentClass owne)。所以我最刚开始认为是将字段封装成一个PersistentClass类,然后在new一个Map。 但是后来我发现并不是这个类,mapping中的类都是用来做映射文件用的,也就是说我的方向错了。 而用select new map这个语句到底是降低了效率还是提高了效率了呢? 简单说一下就是:你在写sql语句的时候,select * from效率高还是select 字段1,字段2 from 效率高? 答案很显然,前者效率一定不高于后者,因为后者可以只选择有用的数据进行传输。 现在再回来看select new map,不就是这个道理么?下面是我坐了几个例子进行了一下效率的对比(我用的是100条数据)。 单表查询 html view plaincopyprint?1. /开始查询2. longstartTime=System.currentTimeMillis();3. Stringhql=selectnewmap(asname)fromUseru;4. Listlist;5. list=session.createQuery(hql).list();6. /查询完毕7. doubletime=(System.currentTimeMillis()-startTime);8. NumberFormatnumberFormat=newDecimalFormat(0.000);9. System.out.println(numberFormat.format(time/1000);10. /循环读取数据11. for(Iteratoriter=list.iterator();iter.hasNext();)12. Mapmap=(Map)iter.next();13. System.out.println(map.get(name);14. 15. /循环读取完毕16. time=(System.currentTimeMillis()-startTime);17. System.out.println(numberFormat.format(time/1000);/开始查询long startTime=System.currentTimeMillis();String hql=select new map( as name) from User u;List list;list=session.createQuery(hql).list();/查询完毕double time=(System.currentTimeMillis()-startTime);NumberFormat numberFormat=new DecimalFormat(0.000);System.out.println(numberFormat.format(time/1000);/循环读取数据for(Iterator iter=list.iterator();iter.hasNext();)Map map=(Map) iter.next();System.out.println(map.get(name);/循环读取完毕time=(System.currentTimeMillis()-startTime);System.out.println(numberFormat.format(time/1000); 开始和结束时间分别为:0.178,0.185html view plaincopyprint?1. /开始查询2. longstartTime=System.currentTimeMillis();3. Stringhql=fromUser;4. Listlist;5. list=session.createQuery(hql).list();6. /查询完毕7. doubletime=(System.currentTimeMillis()-startTime);8. NumberFormatnumberFormat=newDecimalFormat(0.000);9. System.out.println(numberFormat.format(time/1000);10. /循环读取数据11. for(Iteratoriter=list.iterator();iter.hasNext();)12. Usermap=(User)iter.next();13. System.out.println(map.getName();14. 15. /循环读取完毕16. time=(System.currentTimeMillis()-startTime);17. System.out.println(numberFormat.format(time/1000);/开始查询long startTime=System.currentTimeMillis();String hql=from User;List list;list=session.createQuery(hql).list();/查询完毕double time=(System.currentTimeMillis()-startTime);NumberFormat numberFormat=new DecimalFormat(0.000);System.out.println(numberFormat.format(time/1000);/循环读取数据for(Iterator iter=list.iterator();iter.hasNext();)User map=(User) iter.next();System.out.println(map.getName();/循环读取完毕time=(System.currentTimeMillis()-startTime);System.out.println(numberFormat.format(time/1000); 开始和结束时间分别为:0.201,0.210 多表查询html view plaincopyprint?1. /开始查询2. longstartTime=System.currentTimeMillis();3. /Stringhql=selectnewmap(asname,a.usernameasusername)fromRoler,Adminawherer.id=a.role.id;4. Stringhql=selectnewmap(asname,a.usernameasusername)fromAdminajoina.roler;5. Listlist;6. list=session.createQuery(hql).list();7. /查询结束8. doubletime=(System.currentTimeMillis()-startTime);9. NumberFormatnumberFormat=newDecimalFormat(0.000);10. System.out.println(numberFormat.format(time/1000);11. /读取数据12. for(Iteratoriter=list.iterator();iter.hasNext();)13. Mapmap=(Map)iter.next();14. System.out.println(map.get(name)+,+map.get(username);15. 16. /读取完毕17. time=(System.currentTimeMillis()-startTime);18. System.out.println(numberFormat.format(time/1000);/开始查询long startTime=System.currentTimeMillis();/String hql=select new map( as name,a.username as username) from Role r,Admin a where r.id=a.role.id;String hql=select new map( as name,a.username as username) from Admin a join a.role r;List list;list=session.createQuery(hql).list();/查询结束double time=(System.currentTimeMillis()-startTime);NumberFormat numberFormat=new DecimalFormat(0.000);System.out.println(numberFormat.format(time/1000);/读取数据for(Iterator iter=list.iterator();iter.hasNext();)Map map=(Map) iter.next();System.out.println(map.get(name)+,+map.get(username);/读取完毕time=(System.currentTimeMillis()-startTime);System.out.println(numberFormat.format(time/1000); 开始和结束时间分别为:0.171,0.181html view plaincopyprint?1. /开始查询2. longstartTime=System.currentTimeMillis();3. Stringhql=fromAdmin;4. Listlist;5. list=session.createQuery(hql).list();6. /查询结束7. doubletime=(System.currentTimeMillis()-startTime);8. NumberFormatnumberFormat=newDecimalFormat(0.000);9. System.out.println(numberFormat.format(time/1000);10. /读取数据11. for(Iteratoriter=list.iterator();iter.hasNext();)12. Adminmap=(Admin)iter.next();13. System.out.println(map.getRole().getName()+,+map.getUsername();14. 15. /读取完毕16. time=(System.currentTimeMillis()-startTime);17. System.out.println(numberFormat.format(time/1000);/开始查询long startTime=System.currentTimeMillis();String hql=from Admin;List list;list=session.createQuery(hql).list();/查询结束double time=(System.currentTimeMillis()-startTime);NumberFormat numberFormat=new DecimalFormat(0.000);System.out.println(numberFormat.format(time/1000);/读取数据for(Iterator iter=list.iterator();iter.hasNext();)Admin map=(Admin) iter.next();System.out.println(map.getRole().getName()+,+map.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论