HQL语句的属性查询
2012-12-31 16:24
197 查看
今天算是真正用到HQL语句的牛逼地方了,之前一直就用到简单的hql语句,比如 from ...., 涉及到需要查询回指定的属性的时候,用的都是sql语句查询,今天,2012年的最后一天,哈哈 我要说no,开始使用HQL。
简单属性查询(重要)
* 单一属性查询,返回结果集是属性列表,其元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的结果集是对象数组,数组的长度和查询的属性的个数一致
数组元素的类型和查询的属性类型一致
* 如果认为返回的数组不够对象化,可以采用hql动态生成实体对象
参见:SimplePropertyQuery.java
事出有因,最近项目中遇到的问题是,查询返回大数据量的时候,效率相当低下,返回13246条数据耗费30多秒,这是在没有加索引的时候,加了索引也需要10多秒甚至20多秒,原因是查询的是整个对象,而不是其中的某些属性。
解决方法:有两种
1、使用了视图查询。因为我的查询涉及到3张表,需要3张表中的数据,因此我先给没个表的相关字段添加了索引,然后建立了视图,视图返回的是我需要的这三张表中的数据,便于代码中我的使用。
2 、不适用视图。同样使用HQL语句,到三张表对应的对象查询。
马上上代码:
视图查询:
VI_PATIENT是视图,ViPatient是视图对应的POJO 。
普通方式:
下面的语句中:TUmUserdetail 、TUmUserrole、TUmUser 都是对象,并不是表名称,u.pid,u.userid 等等使用的都是对象属性名。
以上方式都是HQL查询方式。哈哈!!!开门红迎接2013年的到来。
简单属性查询(重要)
* 单一属性查询,返回结果集是属性列表,其元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的结果集是对象数组,数组的长度和查询的属性的个数一致
数组元素的类型和查询的属性类型一致
* 如果认为返回的数组不够对象化,可以采用hql动态生成实体对象
参见:SimplePropertyQuery.java
package com.wlh.hibernate; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.hibernate.Session; public class SimplePropertyQuery extends TestCase{ //单个属性查询 public void testQuery1(){ Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //单个属性查询,返回结果集属性集合,其元素类型和实体类中相应属性的类型一致 List students=session.createQuery("select name from Student ").list(); for(Iterator iter=students.iterator();iter.hasNext();){ String name=(String)iter.next(); System.out.println("name="+name); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } //多个属性查询 public void testQuery2(){ Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //查询多个属性其集合元素是对象数组l列表。即,多个对象数组的集合 //数组元素中的类型与对应的实体类中的属性类型一致 //数组的长度取决于查询的属性个数 List students=session.createQuery("select id,name from Student ").list(); for(Iterator iter=students.iterator();iter.hasNext();){ Object[] o=(Object [])iter.next(); System.out.println("id="+o[0]+",name="+o[1]); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } //多个属性查询 public void testQuery3(){ Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); List students=session.createQuery("select new Student(id,name) from Student ").list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student o=(Student)iter.next(); System.out.println("id="+o.getId()+",name="+o.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
事出有因,最近项目中遇到的问题是,查询返回大数据量的时候,效率相当低下,返回13246条数据耗费30多秒,这是在没有加索引的时候,加了索引也需要10多秒甚至20多秒,原因是查询的是整个对象,而不是其中的某些属性。
解决方法:有两种
1、使用了视图查询。因为我的查询涉及到3张表,需要3张表中的数据,因此我先给没个表的相关字段添加了索引,然后建立了视图,视图返回的是我需要的这三张表中的数据,便于代码中我的使用。
2 、不适用视图。同样使用HQL语句,到三张表对应的对象查询。
马上上代码:
视图查询:
VI_PATIENT是视图,ViPatient是视图对应的POJO 。
HQLStr = "select vipatient from ViPatient vipatient where 1=1 ";
普通方式:
下面的语句中:TUmUserdetail 、TUmUserrole、TUmUser 都是对象,并不是表名称,u.pid,u.userid 等等使用的都是对象属性名。
HQLStr= "select u.pid,u.userid,d.photoid,d.phonenum,r.rolecode "+ " from TUmUserdetail d, TUmUserrole r ,TUmUser u where u.userid = r.userid and u.userid = d.userid and r.rolecode='02'"+ "and u.status = 'Active'";
以上方式都是HQL查询方式。哈哈!!!开门红迎接2013年的到来。
相关文章推荐
- hql语句实现查询对象部分属性
- hql语句实现查询对象部分属性
- hibernate HQL 语句 只查询对象里面的某些属性
- Hibernate查询时,使用HQL和SQL的区别(SUM语句)
- hibernate 中HQL语句查询学习
- Hibernate查询技术之HQL语句
- struts+hibernate+mysql HQL语句查询带中文的查询不出数据的解决方法
- hibernate的hql查询语句总结
- Java自学笔记之Hibernate-单表hql查询语句
- 在Hibernate执行一对多表查询的HQL语句,怎样循环打印出结果
- 使用jpa hql语句查询关联多个表 如何用struts的iterator接受显示数据
- Hibernate_根据条件动态组装sql/hql语句(仿ibatis动态查询语句功能)
- 关于在SSH框架整合时,使用hql语句查询出现 XXX is not mapped 的问题
- HQL查询语句拼接规范,避免SQL注入攻击
- hibernate查询语句---HQL
- hibernate查询语句--HQL
- Hql查询语句
- sql工具:一条sql语句,查询sql server某个指定表的所有列及其属性
- hibernate的hql查询语句总结
- hibernate的hql查询语句总结