• 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]);
    }
  • 相关阅读:
    宿舍助手app——个人工作第四天
    宿舍助手app——个人工作第三天
    对QQ输入法的评价
    冲刺9
    冲刺8
    冲刺7
    冲刺6
    冲刺5
    冲刺4
    冲刺3
  • 原文地址:https://www.cnblogs.com/zhouyeqin/p/7196236.html
Copyright © 2020-2023  润新知