/2011年8月24日 09:32:26 by rush/
本文旨在讨论使用Hibernate框架中进行的HQL查询和SQL查询中的使用方式,以及各种方法的使用方便程度,纯属个人观点,如果有什么不对的地方欢迎指教。开发环境为Myeclipse6.0,开发使用的框架为SSH(Spring+Struts+Hibernate)+(Ajax,JQuery,DWR)框架,后台数据库采用的是SQL Server2005数据库软件,项目部署是在JBoss4.0服务器上面,数据库连接采用JBoss JNDI的连接方式。
1.首先,假设下面的表存在:
1 create table test(
2
3 int id primary key identity(1,1), //id,主键,自增型
4
5 varchar(10) name, //姓名
6
7 int age,//年龄
8
9 varchar(1) sex//性别
10
11 )
将上面的数据库表反向工程到项目中,即生成数据库表到数据库对象之间的对象关系映射,这一步不会的同鞋可以参考我的SSH环境搭建方面的文章,反向生成的对象如下:
1 public class Test implements java.io.Serializable {
2
3 private int id;
4
5 private String name;
6
7 private int age;
8
9 private String sex;
10
11 public void setId(int id){
12
13 this.id = id;
14
15 }
16
17 public int getId(){
18
19 return this.id
20
21 }
22
23 .........................另外三个属性的getter和setter方法类似,这里省略。
24
25 }
2.在DAO层中生成的一些方法例如:findById,findAll。。。。等等可以直接使用,我们现在说的是怎么自己写HQL查询语句,并读取返回的结果。
String hql = " from Test t where t.id = 1";//这是一个简单的HQL查询语句,可以使用DAO层提供的函数进行查询
List<Test> list = getHibernateTemplate().find(hql);//返回结果为list形式
如果在list声明中指定了其类型,那么在使用的时候就不用进行强制类型转换这一步骤了,见下:
int id = list.get(0).getId();
如果没有指定类型:
int id = (Test)list.get(0).getId();
3.hibernate中的多表查询,现在假设对Test表和Student表进行查询,多表查询如果在对象关系映射中没有指定其对应关系,那么查询得到的结果是Object[]类型,查询结果里面每一条数据为Object类型,如果要对其进行继续处理,必须将其转换成其他类型,如果想了解具体的内容或者有疑问的地方可以给我留言。
多表查询生成HashMap的方法,在写HQl语句的时候指定要查询的结果类型为HashMap类型,那么得到的查询结果将是键值对的形式,语句如下:
String hql = " select new map( t.id as id,t.name as name,s.address as address ) from Test t,Student s ";
List<Map> list = this.getSession().createQuery(hql).list()或者 getHibernateTemplate().find(hql);
取值实例:
Map map = new HaspMap();
map = list.get(0);
String name = map.get("name").toString();
如果需要具体的实例代码,请留言。
4.最后一种形式是直接的SQL查询语句,SQL查询的返回结果全部是数据没有列明的概念,因此返回的数据类型为Object格式,需要进行强制转化成其他的方式才能使用。
5.在JSP页面中的使用:
对象类型的直接使用对象名.属性名的方式使用即可;Object类型的需要根据下标来得到数据,即object[0],object[1]....;HashMap类型的与对象类型的使用方式相同,也是通过对象名.属性名的方式使用。
由此可知,对于单表查询使用对象即可,对于多表查询又没有在对象关系映射中指定其对应关系,那么使用HaspMap的方式最方便,使用SQL直接查询的方式虽然有的时候能解决一些使用HQL不好解决的问题,但是其查询结果必须使用下标的形式才能得到,灵活性不够。