HQL语句的属性查询

今天算是真正用到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年的到来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值