日期:2014-05-16 浏览次数:20432 次
HQL的定义:
HQL 是Hibernate Query Language的简写,即 hibernate 查询语言:
HQL采用面向对象的查询方式。HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方 式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。
?
用法:
在了解其用法之前,请先看下面的代码:
@SuppressWarnings("unchecked") public List<TCourse> getAllCourse(){ //查询所有的课程 // TODO Auto-generated method stub List<TCourse> tc = null; //定义集合 try { HibernateUtil.beginSession(session); //开始会话(调用HibernateUtil类中的方法) Query q = session.createQuery("from TCourse"); //创建查询,从课程表中查询 tc = (List<TCourse>) q.list(); //获取的数据放在集合内 //if(commit) HibernateUtil.commitTransaction(session); //提交事务 } catch(RuntimeException e) { HibernateUtil.rollbackTransaction(session); //若有异常的话,就回滚 throw e; } return tc; }
?
?
上面的代码中查询语句就运用到HQL语言。
完整的HQL语句形式如下:
Select/update/delete……from……where……groupby……having……orderby……asc/desc
其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。
?
1:实体查询:
例子如下:
String hql=”from User user”;
List list=session.CreateQuery(hql).list();
上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回
?
2:实体的更新和删除:
例子如下:
更新的:
Transaction trans=session.beginTransaction();
String hql=”update User user set user.age=20 where user.age=18”;
Query queryupdate=session.createQuery(hql);
intret=queryupdate.executeUpdate();
trans.commit();
删除的:
Transaction trans=session.beginTransaction();
Stringhql=”delete from User user where user.age=18”;
Queryqueryupdate=session.createQuery(hql);
intret=queryupdate.executeUpdate();
trans.commit();
?
3、属性查询:
很多时候我们在检索数据时,并不需要获得实体对象所对应的全部数据,而只需要检索实体对象的部分属性所对应的数据。这时候就可以利用HQL属性查询技术,如下面程序示例:
List list=session.createQuery(“select user.name from User user”).list();
for(int i=0;i<list.size();i ){
System.out.println(list.get(i));
}
我们只检索了User实体的name属性对应的数据,此时返回的包含结果集的list中每个条目都是String类型的name属性对应的数据。我们也可以一次检索多个属性,如下面程序:
List?list=session.createQuery(“select?user.name,user.age?from?User?user?”).list();
for(int?i=0;i
Object[]?obj=(Object[])list.get(i);
System.out.println(obj[0]);
System.out.println(obj[1]);
}
此时返回的结果集list中,所包含的每个条目都是一个Object[]类型,其中包含对应的属性数据值。作为当今我们这一代深受面向对象思想
影响的开发人员,可能会觉得上面返回Object[]不够符合面向对象风格,这时我们可以利用HQL提供的动态构造实例的功能对这些平面数据进行封装,如
下面的程序代码:
Listlist=session.createQuery(“selectnewUser(user.name,user.age)fromUseruser”).list();
for(inti=0;i
Useruser=(User)list.get(i);
System.out.println(user.getName());
System.out.println(user.getAge());
}
这
里我们通过动态构造实例对象,对返回结果进行了封装,使我们的程序更加符合面向对象风格,但是这里有一个问题必须注意,那就是这时所返回的User对象,
仅仅只是一个普通的Java对象而以,除了查询结果值之外,其它的属性值都为null(包括主键值id),也就是说不能通过Session对象对此对象执
行持久化的更新操作。如下面的代码:
Listlist=session.createQuery(“selectnewUser(user.name,user.age)fromUseruser”).list();
for(inti=0;i
Useruser=(User)list.get(i);
user.setName(“gam”);
session.saveOrUpdate(user);//
这里将会实际执行一个save操作,而不会执行update操作,因为这个User对象的id属性为null,Hibernate会把它作为一个自由对象
(请参考持久化对象状态部分的论述),因此会对它执行save操作。
}
?
4.分组与排序
Order by子句:
???? from TUser user order by user.name, user.age desc
Group by子句和Having子句
???? "select count(user), user.age from TUser user group by user.age having count(user)>10"
5.参数邦定
通过顺序占位符?来填充参数:
1)hibernate 2 中通过session.find方法来填充
??????? session.find("from TUser user where user.name=?", "Erica", Hibernate.STRING);
?? 多个参数的情况:
??????? Object[] args = new Object[] {"Erica", new Integer(20)};
??????? Type[] types = new Type{Hibernate.STRING, Hibernate.INTEGER};
??????? session.find("from TUser user where user.name=? and user.age=?", args, types);
2)通过Query接口进行参数填充:<