Hibernate的检索方式--查询数据的方式

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


不支持


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

时间: 2024-10-09 02:55:36

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

Hibernate的检索及五种数据检索方式

检索数据时的 2 个问题 1). 不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象, 而程序实际上仅仅需要访问 Customer 对象, 那么这些关联的 Order 对象就白 白浪费了许多内存. 2). 更高的查询效率:发送尽可能少的 SQL 语句 类级别的检索策略 2. 类级别的检索策略:(主要掌握 load 方法和 get 方法的区别!) 1). 类级别可选的检索策略包括立即检索和延迟检索, 默认为延迟检索 ①. 立即检

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

俗话说:"好记性不如烂笔头".本人学习Hibernate也有一个星期了,对Hibernate也有一个初步的了解.下面对Hibernate显示数据做个笔记,使用租房系统的Hibernate+jsp+selvect. 第一步:编写房屋实体类 /* * 房屋实体类 */ public class House { private int id;//房屋id private String title;//标题 private String description;//描述 private Str

Hibernate之检索方式

时间:2017-1-22 16:09 --检索方式 Hibernate中提供了以下几种检索对象的方式:    *   导航对象图检索方式        根据已经加载额对象导航到其他对象.        >   Customer customer = (Customer)session.get(Customer.class, 1)            customer.getOrders(); // 得到客户的订单 *   OID检索方式        按照对象的OID来检索对象.       

hibernate的三种查询方式

hibernate的查询方式常见的主要分为三种: HQL, QBC, 以及使用原生SQL查询(Session的查询) 1)Query的查询:使用HQL语句或SQL语句完成查询 2)Criteria的查询:通过方法和类中属性的关系,来设置查询条件,完成查询. 3)Session的查询:按主键查询查询,方法为get或load 一.HQL查询 ? HQL(Hibernate Query Language)提供了丰富灵活的查询方式,使用HQL进行查询也是Hibernate官方推荐使用的查询方式. ? H

【Hibernate】检索方式

一.概述 二.HQL 2.1 简介 2.2 查询所有记录 2.3 查询使用别名 2.4 排序 2.5 分页查询 2.6 单个对象查询 2.7 参数绑定 2.8 投影操作 2.9 模糊查询 2.10 SQL多表查询 2.11 HQL多表的查询 三.QBC 3.1 简介 3.2 查询所有记录 3.3 排序 3.4分页 3.5获取单个对象 3.6 带参数的查询 3.7 模糊查询 四.SQL 4.1 简介 4.2 SQL语句查询所有记录 一.概述 检索方式:查询的方式 导航对象图检索方式: 根据已经加载

Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.其它的,包括一些查询函数(count(),sum()等).查询条件的设定等,全都跟SQL语法一样. 示例: Session session = SessionFactory.getCurrentSession(); User user = null; Transaction ts = s

Hibernate查询的六种方式

Hibernate查询的六种方式 分别是HQL查询,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询. 如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能,但是想多学知识就看一下这六种方法,他们提供了更多选择.当然每一种方法都有其适用的情况与前提. 1.HQL查询 HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点.示例代码: [java] view plain copy

【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目

备份短信和添加短信 操作系统短信的uri: content://sms/ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima28.backupsms" android:versionCode="1

awt可视化界面上传数据到mysql,jsp通过jdbc方式查询数据库,并将结果打印在网页上

今天尝试写一个小demo实现下之前看过的代码,目的了解不同文件的数据访问,掌握如何获取前台数据,如何将数据库的数据在前端页面展示. awt可视化界面可已实现提交数据到数据库,也可查询数据在控制台打印. web工程:主要是web前台输入并提交数据,然后在另一页面展示数据库内容 源码:http://download.csdn.net/detail/xiejun1026/8038489