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检索方式(是面向数据库的,多以查询时字段时数据的字段)

       采用HQLQBC检索方式时,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对查询结果排序

HQLQBC都支持对查询结果进行排序。

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分页查询

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

8检索单个对象

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

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

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

三、连接查询

HQLQBC支持的各种连接类型

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

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

不支持

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

posted @ 2015-04-11 21:55  Jeremy_software  阅读(1127)  评论(0编辑  收藏  举报