Hibernate查询方式比较

/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不好解决的问题,但是其查询结果必须使用下标的形式才能得到,灵活性不够。

posted @ 2011-08-24 10:03  Rush_SONG  阅读(5625)  评论(0编辑  收藏  举报