日期:2014-05-16  浏览次数:20432 次

HQL学习(一)

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接口进行参数填充:<