Hibernate提供了以下几种检索对象的方式:

A、导航对象图检索方式。
B、OID检索方式。Session.get() load();
C、HQL检索方式。Query.
D、QBC检索方式。Query By Criteria.
E、本地SQL检索方式。

一、HQL检索方式:Hibernate Query Language
  HQL是面向对象的查询语言。它包含以下功能:

1、在查询语句中设定各种查询条件。
2、支持投影查询,即仅检索出对象的部分属性。
3、支持分页查询。
4、支持连接查询。
5、支持分组查询,允许使用having和group by关键字。
6、提供内置聚集函数,如sum()、min()和max()。
7、能够调用用户自定义的SQL函数或者标志SQL函数。
8、支持子查询,即嵌入式查询。
9、支持动态绑定参数。

二、QBC检索方式:
  QBC API提供了检索对象的另一种方式,它以Criteria接口、Criterion接口、Restrictions接口组成,支持在运行时动态生成查询语句。
实例代码:

//创建一个Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
//设定查询条件,然后把查询条件加入到Criteria中。
Criterion criterion1 = Restrictions.like("name","T%");
Criterion criterion2 = Restrictions.eq("age",new Integer(21)); criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2); List result = criteria.list(); //支持链式编程
List result=session.createCriteria(Customer.class)
.add(Restrictions.like("name","T%"))
.add(Restrictions.eq("age",new Integer(21)))
.list();

上述程序执行的SQL语句为:

select ID,NAME,AGE from CUSTOMERS where NAME like 'T%' and AGE = 21;

因此,QBC检索方式的一般步骤为:
  1、调用Session接口的createCriteria方法创建一个Criteria对象。
  2、设定查询条件。
  3、调用Criteria接口的list()方法。

三、本地SQL检索方式:
此种方式一般是针对SQL方言生成一些特殊的查询语句。
一个实例代码说明:

Query query = session.createSQLQuery("select * from CUSTOMERS where NAME like :customerName and AGE=:customerAge");
query.setString("customerName","T%");
query.setInteger("customerAge", 21);
list result = query.list();

四、多态查询:
HQL和QBC都支持多态查询,多态查询是指查询出当前类及所有的子类的实例。
举例说明:
  HQL中:from java.lang.Object将检索出所有的持久化对象。
  from java.io.Serializable将检索出所有实现该接口的持久化对象。

五、对查询结果排序:
  HQL通过order by关键字对查询结果排序。
  QBC通过org.hibernate.criterion.Order类对查询结果排序。
  实例代码:

//HQL方式
Query query = session.createQuery("from Customer c order by c.name");
//QBC方式:
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.asc("name"));

六、分页查询:
  通过Query或者Criteria接口的setFirstResult(int firstResult);和setMaxResult(int maxResult);实现。

七、检索单个对象(uniqueResult()方法):
  对Query或者Criteria接口都有效。
  setMaxResult(1).uniqueResult();

八、按主键逐个处理查询结果(iterate()方法):
  list()方法执行的SQL语句中包含表中的所有字段,即selec * from tablename...
  iterate()方法执行的SQL语句仅包含ID字段,即select ID from tablename...
  当调用Iterator.next()方法时,先到Session缓存及二级缓存中查看是否存在拥有特定OID的对象,不存在时再去数据库中加载。
  一般情况下应该考虑使用list()方法,以下场合可以考虑使用iterate()方法提高查询性能:
    1、表中包含了大量的字段。
    2、启动了二级缓存,而且二级缓存中可能已经包含待查询的对象。

九、可滚动的结果集:
  Query或者Criteria接口的scroll()方法返回一个ScrollableResults对象,它就代表可滚动的结果集。
  不做详解。
十、在HQL查询语句中绑定参数:
  1、绑定方式:按名称绑定和按位置绑定。
  2、绑定的API:

setString()...
setEntity()...和一个持久化类的实例绑定。
setParameter("name",name,Hibernate.STRING)...第三个参数显式指定Hibernate映射类型。
setProperties()...了解即可

十一、设置查询附属事项:
Query或者Criteria接口的方法:

setFlushMode():设置清理缓存的模式。通过FlushMode的三个常量来指定。
setCacheMode():设置Session与第二级缓存的交互模式。通过CacheMode的5个常量来指定。
setTimeout():设置执行查询数据库操作的超时时间。
setFetchSize():为JDBC驱动程序设置批量抓取的数目。
setLockMode():设置所得模式。
setComment():为SQL日志设置注解。

Session.setReadOnly():设置查询结果是否只允许读。

十二、在映射文件中定义命名查询语句:
  <query name="findCustomerByName" ...> <sql-query...>
  代码:

Query query = session.getNameedQuery("findCustomerByName"); 

十三、在HQL查询语句中调用函数:
  除了预置的函数以外,还可以通过Configuration.addSqlFunction()方法把特定的SQL函数注册到HQL中。

十四、设定查询条件:
  HQL查询语句可以通过where子句来设定查询条件。
  QBC则必须创建一个Criterion对象来设定查询条件。通过Restrictions类来创建,参见上面的例子。支持比较运算、范围运算、字符串模式匹配、逻辑运算、集合运算。

攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

  2. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  3. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

  4. 攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制

    Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应.为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值.Hibe ...

  5. 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序

    1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...

  6. 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题

    一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...

  7. 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置

    一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...

  8. 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略

    本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...

  9. 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合

    一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...

随机推荐

  1. django的分页--不全也未实现

    一.Django内置分页 Paginator 二.自定义分页 分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置. 1.设定每页显示数据条数 2.用户输 ...

  2. 9.5---括号是否有效(CC150)

    leetcode原题: char temp ; Stack<Character> stack = new Stack<Character>();//error:Stack< ...

  3. CentOS完美搭建Redis3.0集群并附测试

    线上的统一聊天和推送项目使用的是redis主从,redis版本2.8.6 redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口:slaveof ...

  4. php foreach循环中unset后续的键值问题

    实例: $arr=array('a','b','c','d','e','f'); foreach($arr as $index=>$tmp){ echo $index.'=>'.$tmp. ...

  5. Range Sum Query 2D - Mutable & Immutable

    Range Sum Query 2D - Mutable Given a 2D matrix matrix, find the sum of the elements inside the recta ...

  6. 【leetcode】Populating Next Right Pointers in Each Node II

    Populating Next Right Pointers in Each Node II Follow up for problem "Populating Next Right Poi ...

  7. 8.nodejs权威指南--MongoDB

    1. MongoDB var mongo = require('mongodb'); var host = '127.0.0.1'; var port = mongo.Connecton.DEFAUL ...

  8. gcc-5.4.0 static dwarf2 compile

    ------------------------------------------------------------------------------- 又开始折腾了, 静态编译 gcc-5.4 ...

  9. C#小知识特殊的DefaultValueAttribute

    今天看别人写的源码发现一个特殊的DefaultValueAttribute.使用如下. 原始代码: public class People { private string _Name = " ...

  10. Effective C++ -----条款24:若所有参数皆需类型转换,请为此采用non-member函数

    如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.