Hibernate的检索方式

先来个选择题:

.以下哪些不是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开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值