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. Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入

    一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...

  2. 0067 MySQL的日期字段的取值用单引号

    这两天在做sql练习题http://www.cnblogs.com/zxx193/p/4000467.html的时候,涉及到下面的建表+插数据操作 CREATE TABLE t1( s_no VARC ...

  3. IIS 与 Apache共存

    http://support.microsoft.com/kb/813368 http://www.blueidea.com/computer/system/2006/3585.asp 操作其实也很简 ...

  4. 纯css3实现的竖形二级导航

    之前为大家分享了好多导航菜单.今天给大家带来一款纯css3实现的竖形二级导航.这款导航菜单可以是无限级.一起看下效果图: 在线预览   源码下载 实现的代码. html代码: <div styl ...

  5. oracle存储过程函数

    1.函数 create or replace function get_Destroy_no return varchar2 is Result varchar2(50);begin SELECT m ...

  6. [fork]Linux中的fork函数详解

    ---------------------------------------------------------------------------------------------------- ...

  7. 2.重学javascript 对象和数组

    什么是对象,其实就是一种类型,即引用类型. 一.创建Object类型有两种. ①使用new运算符 <script type="text/javascript"> var ...

  8. asp.net 导出EXCEL超高兼容(不用装Excel)

    用网上的代码你会发现,下载下来后,会提示"你尝试打开的的文件的格式与文件扩展名指定的格式不一致 请验证文件没有损坏且来源可信的提示,研究了好久 后来发现可以使用人家做好的组件NOPI去实现, ...

  9. 在Asp.net中为图像加入水印信息

    using System.Drawing; using System.IO; using System.Drawing.Imaging; private void AddTextToImg(strin ...

  10. 004杰信-关于formSubmit('factorycreate.action','_self')路径的疑惑

    本文材料来源于传智播客,在此说明. 整个项目结构: