您的位置:首页 > 其它

Hibernate的检索方式

2008-12-13 10:49 330 查看
先来个选择题:

.以下哪些不是Hibernate的检索方式:
A、导航对象图检索
B、OID检索
C、ORM检索
D、QBC检索
E、本地SQL检索
F、HQL检索

-------------------------------------------------------------------------------------------

知道答案不,那就先学习一下

Hibernate中,检索对象的方式有:
1、导航图
根据已经加载的对象,导航到其他对象。

2、OID
根据OID加载对象。
session的load()、get()方法。

3、HQL: 面向对象,支持多态查询。
Hibernate Query Language
session的find()方法,简单查询,静态查询;
Query接口,复杂查询,动态加载参数。关键字不区分大小写。

4、QBC Query By Criteria(包括QBE Query By Example): 面向对象,支持多态查询。
封装基于字符串的sql语句,或封装一个对象,此对象的某些属性的值已经确定。

5、本地查询: Native Query
使用本地数据库的SQL查询语句。

一、Hibernate Query Language
1.特点:
1)、可在查询语句中设定查询条件,可动态绑定参数
2)、支持投影查询
3)、支持分页查询
4)、支持链接查询
5)、支持分组查询,可使用having和group by关键字
6)、内置聚集函数,如: sum()、min()、max()等
7)、可调用用户自定义函数
8)、支持子查询

2.find()方法不支持动态绑定参数,推荐使用Query接口。

3.Query接口支持方法链编程风格: 其setXxx()方法返回自身实例而不是返回void。优点: 代码简洁。

如:
List resultList = session.createQuery("...")
.setString("name", "xxx")
.setInteger("age", 100)
.list;
4.支持对查询结果排序,使用order by关键字:
Query query = session.createQuery("from Book as b order by b.title");
Query query = session.createQuery("from Book as b order by b.title asc, b.price desc");

5.检索单个对象
list()结合uniqueResult()方法
如:
Book book = (Book)session.createQuery("from Book as b order by price")
.setMaxResult(1)
.uniqueResult();//返回一个对象
如过确定结果只包含一个对象,可省略调用setMaxResult(1)方法。

6.动态绑定参数
优点:
1)安全,防止注入,injection。
2)利用底层jdbc的预编译功能,preparedStatement,提高性能。

参数绑定的方式
1)根据名字绑定,推荐方式,可读性好,便于维护。
如:
Query query = session.createQuery("from Book as b where b.title=:title");
query.setString("title","jsp");

2)根据位置绑定,第一个参数位置为0
如:
Query query = session.createQuery("from Book as b where b.title=?");
query.setString(0,"jsp");

7.在映射文件中定义命名查询语句: xxx.hbm.xml
<hibernate-mapping >
<class ...>

<query name="findBookByTitle">
<![CDATA[from Book b where b.title like :title]]>
</query>

</hibernate-mapping>

如:
Query q=session.getNamedQuery("findBookByTitle");
q.setString("title", title);
List l=q.list();

二、Query By Criteria
1.由Criteria接口、Crieterion接口、Expression类组成。
2.Expression类提供用于设定查询条件的静态方法,都返回Criterion实例,每个实例代表一个查询条件。
Criteria的add()方法用于添加查询条件。

3.Criteria接口支持方法链编程,其add()方法返回自身实例。

如:
List resultList = session.createCriteria(Book.class)
.add(Expression.like("title","j%")
.add(Expression.eq("price",new Integer(100))
.list();

4.支持对查询结果排序,使用net.sf.hibernate.expression.Order关键字:
如:
Criteria criteria = session.createCriteria(Book.class);
criteria.addOrder(Order.asc("name"));
List list = criteria.list();

5.检索单个对象
list()结合uniqueResult()方法
如:
Book book = (Book)session.createCriteria(Book.class)
.add(Expression.like("title","j%")
.add(Expression.eq("price",new Integer(100))
.setMaxResult(1)
.uniqueResult();

三、Query By Example

1.先创建一个对象,此对象的某些属性的值已经确定,以这些属性作为条件来检索对象。
如:
Book book = new Book();
book.setTitle("java");

List resultList = session.createCriteria(Book.class)
.add(Example.create(book)
.list();

执行:
select * from BOOKS where name='java'

2.以作为标准的对象的所有不为null的属性作为查询条件。
只支持"="和"like"。

四、SQL
使用Query接口。不推荐。

如:
Query query = session.createSQLQuery(
select {b.*} from BOOKS b where b.TITLE like:title"
);
query.setString("title", "j%");
List list = query.list();

补充:
Query和Criteria接口都支持分页查询。
setFirstResult(int firstResult):设定从哪一个对象开始查询。
setMaxResult(int maxResult):设定一次检索出的对象数,指最大数值。
索引位置从0开始。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: