您的位置:首页 > 其它

HQL语句的属性查询

2012-12-31 16:24 197 查看
今天算是真正用到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年的到来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: