zoukankan      html  css  js  c++  java
  • 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

    不支持

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

  • 相关阅读:
    WebSocket客户端连接不上和掉线的问题以及解决方案
    中国(China): 上海地图和经维度
    在程序开发中怎样写SQL语句可以提高数据库的性能
    C# 正则表达式
    asp.net mvc 2.0 【1】
    c#获取相对路径的八种方法
    ASP.NET 常用对象
    Python自动化开发基础和数据类型
    Python自动化开发数据类型之集合
    Python自动化开发数据类型之字符串
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4418553.html
Copyright © 2011-2022 走看看