HQL查询

本节内容:

  • hibernate检索方式说明
  • 什么是HQL
  • HQL检索方式
    • HQL查询的from子句
    • HQL查询的select子句
    • HQL查询的聚集函数
    • HQL查询的where子句
    • 绑定参数
    • 排序
    • 分组函数
    • 分页查询
    • 对象导航式
    • 连接查询
  • 本地 SQL 检索方式

1  Hibernate 提供了以下几种检索对象的方式

  • l  OID检索方式(Object Identifier)

    OID对象标始符,按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。

  • l  HQL检索方式

    使用面向对象的HQL查询语言。 Hibernate提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句

  • l  QBC检索方式

    使用(Query By Criteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更面向对象的接口。

  • l  本地SQL检索方式

    使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBC ResultSet结果集映射成为对象图。

2  什么是HQL

Hibernate语言查询(Hibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。它和SQL查询语言有些相似.在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式.它有如下功能:

  • l  在查询语句中设定各种查询条件
  • l  支持投影查询, 即仅检索出对象的部分属性
  • l  支持分页查询
  • l  支持连接查询
  • l  支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字
  • l  提供内置聚集函数, 如 sum(), min() 和 max()
  • l  能够调用用户定义的 SQL 函数或标准的 SQL 函数
  • l  支持子查询
  • l  支持动态绑定参数

3  HQL检索方式包括以下步骤: 

  •  通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数
  • 动态绑定参数
  • 调用 Query 的 list() 方法执行查询语句. 该方法返回 java.util.List 类型的查询结果, 在 List 集合中存放了符合查询条件的持久化对象.

HQL和SQL比较:

不同点:

  • l  HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL 查询语句中的主体是域模型中的类及类的属性
  • l  SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表的字段

相似点:

  •  HQL的语法类似SQL语法

3.1 HQL查询的from子句

From是最简单、最基本的HQL语句。From关键字后紧跟持久化类的类名。

如:from News

    标明是检索出所有的学生实体。

推荐使用别名的形式:from News as s 。as关键字是可选的。为了增强可读性,建议保留别名。

案例:查询所有的新闻信息

public void hqlQuery(){
        //获取session
        Session session = HibernateUtil.getSession();
        try{
            //通过 Session 的 createQuery() 方法创建一个 Query 对象
            Query newsq = session.createQuery("from News as s");
            //调用 Query对象 的 list()方法执行查询语句
            List<News> newsl = newsq.list();
            if(newsl!=null){
                for(int i=0;i<newsl.size();i++){
                    News news = newsl.get(i);
                    System.out.println(news.getTitle());
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            HibernateUtil.closeSession(session);
        }
    }

3.2 HQL查询的select子句

select子句用于选择指定的属性或直接选择某个实体,当前整个select选择的属性必须是from后持久化类包含的属性。

案例:查询新闻属性值

public void hqlQuery(){
        //获取session
        Session session = HibernateUtil.getSession();
        try{
            //通过 Session 的 createQuery() 方法创建一个 Query 对象
            Query newsq = session.createQuery("select s.title,s.content from News as s");
            //调用 Query对象 的 list()方法执行查询语句
            List newsl = newsq.list();
            for(Object obj : newsl){
                Object[] news = (Object[]) obj;
                System.out.println(news[0]+"---"+news[1]);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            HibernateUtil.closeSession(session);
        }
    }

3.3 HQL查询的聚集函数

HQL支持在选出的属性上,使用聚集函数。HQL支持的聚集函数与SQL的完全相同,有5个:avg ;count;max;min;sum。

案例:查询新闻总数

public void hqlQuery(){
        Session session = HibernateUtil.getSession();
        try{ 
            Query newsq = session.createQuery("select count(0) from News as s"); 
            String newsl = newsq.uniqueResult().toString();
            System.out.println(newsl);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            HibernateUtil.closeSession(session);
        }
    }

3.4 HQL查询的字符串连接

  • l  select子句还支持字符串连接符、算术运算符,以及SQL函数
  • l  select子句也支持使用distinct和all关键字,此时的效果和SQL中的效果完全相同
  • l  如:select s.id||“”||s.stuName from Student as s

3.5 HQL查询的where子句

  • l  where子句用于筛选选中的结果。如: from Student as s where s.stuName like ‘班级1%’
  • l  为where子句中的参数赋值,可以绑定参数
  • l  Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能
  • l  HQL 的参数绑定有两种形式:
    • 按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置
    • 按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.

案例:检索新闻名字为“title1”的新闻内容信息

//按参数位置: 
Query newsq = session.createQuery("from News s where s.title=?");
newsq.setString(0, "title1");
List newsl = (List) newsq.list();
for(Object obj : newsl){
    News news = (News) obj;
    System.out.println(news.getContent());
}
//按参数名称: 
Query newsq = session.createQuery("from News s where s.title=:title");
newsq.setString("title", "title1"); 

3.6 排序和分组函数

  • l  HQL 采用 ORDER BY 关键字对查询结果排序

      如:form Student s order by s.id

  • l  HQL中可以使用group by和having

      如:按照班级进行分组,统计班级人数超过5人的班级名

3.7 分页查询

  • l  setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
  • l  setMaxResult(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象

案例:新闻信息顺序排列后,显示第一页记录,每页显示4条记录。

Query newsq = session.createQuery("from News s order by s.id asc");
newsq.setFirstResult(0);
newsq.setMaxResults(4);
List newsl = (List) newsq.list();
for(Object obj : newsl){
    News news = (News) obj;
    System.out.println(news.getContent());
}

3.8 对象导航式

案例:表间的连接,可以用对象导航式完成(Order和Customer是多对一的映射关系customer是Order对象中关于Customer对象的属性)

Query newsq = session.createQuery("select o.orderNumber,c.custName from Order o join o.customer c order by o.id asc");
List newsl = (List) newsq.list();
for(Object obj : newsl){
    Object[] object = (Object[]) obj;
    System.out.println(object[0]+"------"+object[1]);
}

4  本地 SQL 检索方式

  • l  HQL还支持原生态的SQL

      如:Query query = session.createSQLQuery("select * from t_student");

案例:检索所有的新闻信息

Query newsq = session.createSQLQuery("select * from news o order by o.id asc");
List newsl = (List) newsq.list();
for(Object obj : newsl){
    Object[] object = (Object[]) obj;
    System.out.println(object[1]+"---"+object[2]);
}

 

posted @ 2017-07-17 16:46  silvan_happy  阅读(252)  评论(0编辑  收藏  举报