今天算是真正用到HQL语句的牛逼地方了,之前一直就用到简单的hql语句,比如 from ...., 涉及到需要查询回指定的属性的时候,用的都是sql语句查询,今天,2012年的最后一天,哈哈 我要说no,开始使用HQL。
简单属性查询(重要)
* 单一属性查询,返回结果集是属性列表,其元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的结果集是对象数组,数组的长度和查询的属性的个数一致
数组元素的类型和查询的属性类型一致
* 如果认为返回的数组不够对象化,可以采用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年的到来。