zoukankan      html  css  js  c++  java
  • 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    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类来创建,参见上面的例子。支持比较运算、范围运算、字符串模式匹配、逻辑运算、集合运算。

  • 相关阅读:
    Keepalived案例一:Keepalived双机热备(HA)精讲
    Linux服务器挂载ntfs移动硬盘
    RAC 单节点实例异常关闭,关键报错ORA--29770
    模拟等待事件:db file sequential read
    使用dbms_stats.gather_table_stats调整表的统计信息
    oracle rac常用的网络检查命令
    收集Oracle数据库中的SQL基线信息(一)基础信息收集
    Oracle 通过sql profile为sql语句加hint
    将指定SQL的执行计划从共享池删除的方法
    数据库什么时候建立索引?
  • 原文地址:https://www.cnblogs.com/tq03/p/3784908.html
Copyright © 2011-2022 走看看