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

  1. A、导航对象图检索方式。
  2. BOID检索方式。Session.get() load();
  3. CHQL检索方式。Query.
  4. DQBC检索方式。Query By Criteria.
  5. E、本地SQL检索方式。

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

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

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

  1. //创建一个Criteria对象
  2. Criteria criteria = session.createCriteria(Customer.class);
  3. //设定查询条件,然后把查询条件加入到Criteria中。
  4. Criterion criterion1 = Restrictions.like("name","T%");
  5. Criterion criterion2 = Restrictions.eq("age",new Integer(21));
  6.  
  7. criteria = criteria.add(criterion1);
  8. criteria = criteria.add(criterion2);
  9.  
  10. List result = criteria.list();
  11.  
  12. //支持链式编程
  13. List result=session.createCriteria(Customer.class)
  14. .add(Restrictions.like("name","T%"))
  15. .add(Restrictions.eq("age",new Integer(21)))
  16. .list();

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

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

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

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

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

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

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

  1. //HQL方式
  2. Query query = session.createQuery("from Customer c order by c.name");
  3. //QBC方式:
  4. Criteria criteria = session.createCriteria(Customer.class);
  5. 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

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

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

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

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

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

  1. 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. Eclipse不给提示no default proposals

    解决方法: (1),找到工程所在的workspace,删除.metadata配置文件. (2),启动eclipse,重新定位到先前的workspace目录置,重建同名工程(不要删除原来的工程,只要建立 ...

  2. 【SpringBoot】SpringBoot 入门示例

    参考资料: http://www.tuicool.com/articles/mqeee2A http://www.cnblogs.com/suncj/p/4065589.html http://spr ...

  3. C# 毕业证书打印《四》

    数据存储,读取控件在Panel中的位置,将控件的位置保存到xml文件中. /// <summary> /// 将当前格式写入xml /// </summary> /// < ...

  4. python to be linux daemon

    所需第三方库:python-daemon[https://pypi.python.org/pypi/python-daemon/] 使用方式: python linux_service.py star ...

  5. Java集合中List的用法

    List接口是Collection接口的子接口,List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列. List可以精确的控制每个元素的插入位置 ...

  6. php优化

    2015年12月14日 21:20:29 之前写过两篇文章: xdebug配置 xdebug trace 结果分析 第二篇里边有两个很耗时间和内存的线条: 第一个斜坡: 从mysql里读取数据后, 用 ...

  7. Tomcat服务器绑定域名的配置

    前面写到过Linux下tomcat服务器的部署,实际上只要域名正常解析到了服务器,那么不用绑定域名也是可以正常访问的,比如默认情况下访问xxx.net:8080与www.xxx.net:8080都可以 ...

  8. 16. javacript高级程序设计-HTML5脚本编程

    1. HTML5脚本编程 l 跨文档消息传递API能够让我们在不降低同源策略安全性的前提下,在来至不同的域的文档间传递消息 l 原生拖放功能可以方便的指定某个元素是否可以拖动,并在放置时做出响应.还可 ...

  9. 去掉mysql数据库字段中的个别字符

     update 表名 set 列名 = REPLACE (mcategory,"要去掉的字符","") where 列名 like "%要去掉的字符% ...

  10. ABAP 将SAP用户ID转换成用户名

    FORM frm_coverted_name USING usrid TYPE sy-uname                        CHANGING name TYPE adrp-name ...