Hibernate 提供了以下几种检索对象的方式
1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)
2OID 检索方式: 按照对象的 OID 来检索对象(更具ID查询---find(Id).get(),load())
3HQL 检索方式: 使用面向对象的 HQL 查询语言
4QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
5本地SQL 检索方式: 使用本地数据库的 SQL 查询语句

现在介绍一下HQL和QBC和本地SQL这三种方式

I HQL检索方式
   方法介绍: 
        setEntity(): 把参数与一个持久化类绑定
        setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定 Hibernate 映射类型
        setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况                        下, Query 从查询结果中的第一个对象开始检索
        setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象

        list():执行查询语句并返回list对象

  字段说明:
        ORDER BY :对结果集排序,那依赖那个字段排序
        DISTINCT 关键字来保证查询结果不会返回重复元素
        GROUP BY 关键字对数据分组,
        HAVING 关键字对分组数据设定约束条件
  notice:SQL标准要求HAVING必须引用GROUP BY子句中的列或用于总计函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING因为SELECT清单中的列和外部子查询中的列。

  字段的使用示例:
        

  HQL 的参数绑定由两种形式:
          按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.
          按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置
  HQL还可以使用数据库的函数--例如:count(),sum(),mix(),max(),avg()
  函数使用示例:  

         Query query = session.createQuery("select count(o.customer),o.orderName FROM Order o");
List list = query.list();
Iterator iter = list.iterator();
Object[] objs = null;
while(iter.hasNext()){
objs = (Object[]) iter.next();
for(int i = 0; i < objs.length; i ++){
  System.out.println(objs[i]);
}
System.out.println("-------------------");
         }

  使用基本步骤:

    1通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句.
    2HQL 查询语句中可以包含命名参数(以":参数名"命名) 然后动态绑定参数
       3调用 Query 相关方法执行查询语句.
notice:Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例, 而不是 void 类型
Example:使用HQL查询order表price大于1000,id=5;

    1创建Query对象:String hql="from order where price >=:price and id=:id"

             Query query=session.createQuery(hql);
    2动态绑定参数:query.setParameter("price","1000").setParameter("id","5");

    3执行语句,返回对象: list<order> orders=query.list(); 
    4然后遍历list就可以得到了order对象了

HQL连接查询==类似SQL语句的连接查询(FETCH:)

  INNER JOIN FETCH: 关键字表示迫切内连接, 也可以省略 INNER 关键字,只有左边和右边都相等的数据才会被查询出来,
              并且在查询出来时,关联的对象也会被初始化
  INNER JOIN    :关键字表示内连接, 也可以省略 INNER 关键字,只有左边和右边都相等的数据才会被查询出来,但是关联的对象在查询时不会被初始化
  LEFT JOIN     :关键字表示左连接, 只有左边有数据才会被查询出来
  OUTER JOIN      :关键字表示右连接, 只有右边有数据才会被查询出来
II QBC查询方式
    
使用步骤
     ①取得criteria对象: Criteria  criteria=session.createCriteria(对象.class)
     ②设置Criterition     ①Criterition criterition=Restrictions.like("name","T%")
              ②Criterition criterition=Expression.like("name", "T%");
     ③为criteria添加criterition,  criteria.add(criterition);
     ④criteria执行list()方法      criteria.list();

采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。
QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。

QBC的add()也是支持链式风格,add()放回的对象也是Criteria 
示例代码:

     @test
public void testQBC(){
Criteria criteria = session.createCriteria(Order.class);
Criterion criterion1 = Expression.like("orderName", "买%");
Criterion criterion2 = Expression.eq("orderId", new Integer(2));
criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2);
List<Order> orders=criteria.list();
for (Order order : orders) {
System.out.println(order.getOrderName());
}
}

Restrictions的用法说明--(Restrictions就是相当于一个条件比较的对象)
方法              说明

Restrictions.eq         =
Restrictions.allEq       利用Map来进行多个等于的限制
Restrictions.gt        >
Restrictions.ge        >=
Restrictions.lt          <
Restrictions.le         <=
Restrictions.between      BETWEEN
Restrictions.like         LIKE
Restrictions.in        in
Restrictions.and          and
Restrictions.or        or
Restrictions.sqlRestriction  用SQL限定查询

III本地SQL的查询模式

SQL检索方式(是面向数据库的,多以查询时字段时数据的字段)

采用HQL或QBC检索方式时,Hibernate生成标准的SQL查询语句,适用于所有的数据库平台,因此这两种检索方式都是跨平台的。

有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。

示例代码:

@Test
public void testSQL(){
Query query = session.createSQLQuery("select * from CUSTOMERS as c where c.CUSTOMER_NAME like :CUSTOMER_NAME and c.CUSTOMER_ID=:CUSTOMER_ID");
// 动态绑定参数
query.setString("CUSTOMER_NAME", "zhangsan");
query.setInteger("CUSTOMER_ID", 2);
// 执行检索
List result = query.list();
Iterator iterator=result.iterator();
  //投影查询(也就是select *)list()方法返回的Object[]对象,Object[0]的第一个字段,object[1]是第二个字段
Object[] objs=null;
while (iterator.hasNext()) {
objs=(Object[])iterator.next();
  for(int i = 0; i < objs.length; i ++){
System.out.println(objs[i]);
}
}
}

IV对查询结果排序

HQL和QBC都支持对查询结果进行排序。

query = session.createQuery("from Customer as c order by c.name");
query.addOrder(Order.asc("name"));
//排序
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("age"));

IIV分页查询

Query和Criteria接口都提供了用于分页显式查询结果的方法。
      setFirstResult(int firstResult):设置从那个对象开始检索,参数表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认从0检索。
      setMaxResult(int maxResults):设置一次最多检索出的对象数目。默认检索所有。

8检索单个对象

Query和Criteria接口都提供了以下用于查询语句并返回查询结果的方法。

list()方法:返回一个List类型的查询结果。

uniqueResult()方法:返回单个对象。

三、连接查询

HQL和QBC支持的各种连接类型

在程序中指定的链接查询类型

HQL语法

QBC语法

使用范围

内连接

inner join 或者 join

Criteria.createAlias()

适用于有关联的持久化类,并且在映射文件中对这种关联关系作了映射。

迫切内连接

inner join fetch 或者 join fetch

不支持

   

左外连接

left outer join 或者 left join

不支持

迫切左外连接

left outer join fetch 或者left join fetch

FetchMode.EAGER
criteria.setFetchMode("orders", org.hibernate.FetchMode.JOIN);

右外连接

right outer join 或者 right join

不支持

交叉连接

ClassA,ClassB

不支持

适用于不存在关联关系的持久化类

Hibernate的检索方式--查询数据的方式的更多相关文章

  1. 通过ajax GET方式查询数据,Django序列化objects

    点击“查找2”按钮,通过ajax GET方式进行查询数据,这样页面不需要整体刷新,之后清空tbody数据,将查询结果重新附加到tbody 前端html: <div class="box ...

  2. Solr记录-solr检索和查询数据

    Solr检索数据 在本章中,我们将讨论如何使用Java Client API检索数据.假设有一个名为sample.csv的.csv文档,其中包含以下内容. 001,9848022337,Hyderab ...

  3. (3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接

    放假这段时间好好的思考了一下关于Scrapy的一些常用操作,主要解决了三个问题: 1.如何连续爬取 2.数据输出方式 3.数据库链接 一,如何连续爬取: 思考:要达到连续爬取,逻辑上无非从以下的方向着 ...

  4. mORMot学习笔记2-2种方式查询数据

    本例使用SqlServer 第一种方式结果放入Memo控件,,需要引用SynCommons, SynDB, SynOleDb; procedure TForm1.Button1Click(Sender ...

  5. Java_Web三大框架之Hibernate+jsp+selvect+HQL查询数据

    俗话说:"好记性不如烂笔头".本人学习Hibernate也有一个星期了,对Hibernate也有一个初步的了解.下面对Hibernate显示数据做个笔记,使用租房系统的Hibern ...

  6. Dynamics CRM2016 查询数据的三种方式的性能对比

    之前写过一个博客,对非声明验证方式下连接组织服务的两种方式的性能进行了对比,但当时只是对比了实例化组织服务的时间,并没有对查询数据的时间进行对比,那有朋友也在我的博客中留言了反映了查询的时间问题,一直 ...

  7. Hibernate search使用示例(基础小结-注解方式)

    (对于项目环境配置,一直没怎么看过.这次经历里从基础环境搭建到hibernate search示例的完成) 1.首先创建project,选择了web project. 2.导入hibernate se ...

  8. Oracle 检索数据(查询数据、select语句)

    用户对表或视图最常进行的操作就是检索数据,检索数据可以通过 select 语句来实现,该语句由多个子句组成,通过这些子句完成筛选.投影和连接等各种数据操作,最终得到想要的结果. 语法: select ...

  9. MyBatis 传入List集合作为条件查询数据

    使用的是SSM框架,数据库是MySQL,做查询的时候传入List集合,使用SQL语句的in方式查询数据 主要有两点问题:我的List集合是利用的另外一个语句查询出来的,传入参数是int类型,返回值是i ...

随机推荐

  1. spawn-fcgi原理及源代码分析

    spawn-fcgi是一个小程序,作用是管理fast-cgi进程,功能和php-fpm类似,简单小巧,原先是属于lighttpd的一部分.后来因为使用比較广泛.所以就迁移出来作为独立项目了.本文介绍的 ...

  2. 改动app的默认设置(包含改动默认launcher)

    1.改为自己的launcher ComponentName component = new ComponentName( context.getPackageName(), MainActivity. ...

  3. linux 流量控制全攻略(TC)

    TC很是强大啊,很多所谓的硬件路由器,都是基于这个做的. TC介绍 在linux中,TC有二种控制方法CBQ和HTB.HTB是设计用来替换CBQ的.它是一个层次式的过滤框架.TC包括三个基本的构成块: ...

  4. C++中常函数内部的this指针也是const类型的

    代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译 // 读取连接信息 void ThirdWizardPage::ReadConnection() { QFile f ...

  5. lua工具库penlight--07函数编程(二)

    列表压缩 列表压缩是以紧凑的方式通过指定的元素创建表.在 Python里,你可以说: ls = [x for x in range(5)]  # == [0,1,2,3,4] 在 Lua,使用pl.c ...

  6. PHP——0128练习相关1——window.open()

    Window.open()方法参数详解 1, 最基本的弹出窗口代码   window.open('page.html'); 2, 经过设置后的弹出窗口   window.open('page.html ...

  7. flume中Source

    Spooling Directory Source: 以下2组参数解释: fileHeader及fileHeaderKey:fileHeader是个布尔值,可配置为true或者false,表示在flu ...

  8. 百度JS模板引擎

    1. 应用场景 前端使用的模板系统  或  后端Javascript环境发布页面 2. 功能描述 提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同 ...

  9. Nginx + Lua + 共享内存

    转自:http://blog.csdn.net/lxb_champagne/article/details/17099383 lua_package_path "/usr/local/sha ...

  10. PHP多进程(4) :内部多进程

    说的都是只兼容unix 服务器的多进程,下面来讲讲在window 和 unix 都兼容的多进程(这里是泛指,下面的curl实际上是通过IO复用实现的). 通过扩展实现多线程的典型例子是CURL,CUR ...