在Hibaernate中提供了丰富的检索(查询)方式,因为项目中涉及到查询特别是复杂查询的时候基本上用的都市iBatis,所以一直都没怎么用Hibaernate自带的查询方法。总的说来Hibernate有如下集中查询方式:
1.根据OID检索某条指定的记录,典型方法如session.load()和session.get();
2.HQL检索方式。HQL是Hibernate Query Language的所写,形式类似SQL语句,只
不过它是面向对象的,从某种程度上而言,你可以说HQL是面向对象的查询语句,而SQL是面向关系的查询语句。使用这种检索方式的典型方法是session.createQuery(String hql),在Hibernate2.0中还有一个session.find方法也是采用的这种检索方式,不过已淘汰了;
3.QBC检索方式。使用Criteria接口的API来检索对象。它封装了基于字符串形式的查询语句,提供了更加面向对象的接口。
4.原生SQL检索。使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBC ResultSet结果集映射为持久化对象图。典型方法如session.createSQLQuery(String sql);
第一种检索方式使用的已经很普遍了,而且也十分简单,下面主要看后三种检索方式。
一.HQL检索方式
代码片段如下:
…………………………………………………………………………………………
Query query=session.createQuery(“from Customer as c where c.name=:name”);
query.setString(“name”,”CMTobby”);
List result=query.list();
…………………………………………………………………………………………
一个典型的HQL检索可以分为3个步骤:
1.创建一个Query类型的对象,它包含一个HQL语句;如上面红底的代码,注意from后面跟的是类名而不是表名;
2.动态绑定参数(如果使用了动态参数的话)。动态绑定参数有两种方式:命名参数绑定和位置参数绑定。上例中采用的命名参数绑定,形式是“冒号:参数名”。还有一种位置参数绑定,如下:
Query query=session.createQuery(“from Customer as c where c.name=?”);
query.setString(0,”CMTobby”);
这个方式同JDBC中的预编译方式相似。当同时使用命名参数和位置参数时,位置参数必须出现在命名参数之前,否则运行出错。如下面的代码:
Query query=session.createQuery(“from Customer as c where c.name=:name and c.sex=?”);
query.setString(0,”F”);
query.setString(“name”,”CMTobby”);
运行时会报错:cannot define positional parameter after any named parameters have been defined
3.调用list()方法执行查询语句。
二.QBC检索方式
代码片段如下:
…………………………………………………………………………………………
Criteria criteria=session.createCriteria(Customer.class);
Criterion criterion1=Expression.eq("sex", "F");
Criterion criterion2=Expression.like("name", "%sb1%");
criteria.add(criterion1);
criteria.add(criterion2);
Result list= criteria.list();
…………………………………………………………………………………………
一个典型的QBC可以分为如下几个步骤:
1.创建一个Criteria类型的对象。上面的红色代码所示。这里我们可以看出QBC是面向对象的,并且显然不支持多表的联合查询,因为它是针对某个持久化类进行的。
2.指定查询条件,如上面的绿色代码所示。每一个Criterion类型的对象代表一个查询条件,把所有的Criterion类型对象增加到Criteria中,Criteria可以看成是一个Criterion的集合,在英文中Criteria就是Criterion的复数形式,因此了解点e文对于我们理解程序还是有帮助的,^_^。指定查询条件我们使用的是Expression类,它继承自Restrictions类,它里面定义了很多设定查询条件的方法,详细情况可以看它的API文档。
3.调用list()方法执行查询语句。
三.使用原生SQL检索(Native SQL)
一个典型的代码如下所示:
…………………………………………………………………………………………
Query query=session.createSQLQuery(“selct * from CUSTOMORS where name=:name”);
query.setString(“name”,”CMTobby”);
List result=query.list();
…………………………………………………………………………………………
这种检索方式和HQL检索方式非常类似,只不过查询语句的风格不同而已,就不详细说明了。