首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate查询技术之HQL语句

Hibernate查询技术之HQL语句

作者头像
大黄大黄大黄
发布2018-09-14 18:13:51
1.5K0
发布2018-09-14 18:13:51
举报

1、session中的get( )和load( )方法来查询对象。但其查询功能有限。

private void testGet(){
        //1.初始化,读取配置文件hibernate.cfg.xml
        Configuration config=new Configuration().configure();
        //2.读取并解析映射文件(Users.hbm.xml),创建sessionFactory
        SessionFactory sessionFactory=config.buildSessionFactory();
        //3.打开session
        Session session=sessionFactory.openSession();
        //4.加载数据
        Users user=(Users)session.get(Users.class, new Integer(1));
        //在控制台输出用户名和密码
        System.out.println(user.getLoginName()+" "+user.getLoginPwd());
}

2、HQL查询方式

使用传统的JDBC API来查询数据,需要编写复杂的SQL语句,然后还要将查询结果以对象的形式进行封装,放到集合对象中保存。这种查询方式麻烦还容易出错。 HQL(hibernate Query Language)是一种面向对象的查询语言,使用类、对象、和属性的概念,没有表和字段的概念。 HQL查询与JDBC查询相比,具有以下优点:

直接针对实体类和属性进行查询,不再编写繁琐的SQL语句;
查询结果是直接保存在List中的对象,不要再次封装;
可以通过配置dialect属性,对不同的数据库自动生成不同的用于执行的SQL语句。

HQL查询具有以下主要功能:

支持属性查询
支持参数查询
支持关联查询
支持分页查询
提供内置聚集函数

HQL查询基本步骤: example 1:

public void testHql_1(){
        //获取session
        Session session=HibernateSessionFactory.getSession();
        //编写HQL语句
        String hql="from Books";
        //创建Query对象
        Query query=session.createQuery(hql);
        //执行查询,获得结果
        List list=query.list();
        //遍历查找结果
        Iterator itor=list.iterator();
        while(itor.hasNext()){
            Books book=(Books)itor.next();
            System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription());
        }
    }

注意:HQL语句from Books中的Books是类名,而不是表名,因此需要区分大小写。关键字from不区分大小写。 session类的find方法及Query接口都支持HQL查询方式。区别在于,find()方法只执行一些简单的HQL查询语句,不具有动态绑定参数的功能,随着hibernate新版本的发行,find()方法将逐步走向淘汰;而Query接口才是真正的HQL查询接口,前面列出的HQL查询功能便是通过该接口提供的。 2.1 属性查询 属性查询也称为投影查询,只查询对象的部分属性,而不是整个对象的数据。 example 2

/**
     * 属性查询
*/
    public void testHql_2(){
        Session session=HibernateSessionFactory.getSession();
        //编写HQL语句,使用属性查询
        String hql="select books.title,books.author from Books as books";
        Query query=session.createQuery(hql);
        List list=query.list();
        Iterator itor=list.iterator();
        //每条记录封装成一个Object数组
        while(itor.hasNext()){
            Object[] object=(Object[])itor.next();
            System.out.println(object[0]+"      "+object[1]);
        }
    }

上述代码中的HQL语句类似于SQL,但是Books是类名。在HQL语句中也可以有别名,例如,books是Books类的别名,别名可以使用关键字as指定,as关键字也可以省略。

2.2 参数查询 实际应用中,需要根据指定条件进行查询。此时,可以使用HQL语句提供的where子句进行查询,或者使用like关键字进行模糊查询。 参数查询的方式有两种:按参数位置查询和按参数名字查询。

2.2.1 按参数位置查询 按参数位置查询时,在HQL语句中需要使用“?”来定义参数的位置。 example 3

/**
     * 参数查询,按参数位置查询
     */
    public void testHql_3(){
        Session session=HibernateSessionFactory.getSession();
        //编写HQL语句,使用参数查询
        String hql="from Books books where books.title like ? ";
        Query query=session.createQuery(hql);
        //给HQL语句中“?”代表的参数设置值
        query.setString(0, "%C++%");
        List list=query.list();
        Iterator itor=list.iterator();
        while(itor.hasNext()){
            Books book=(Books)itor.next();
            System.out.println(book.getTitle()+"      "+book.getAuthor()+"       "+book.getContentDescription());
        }
    }

上述代码中,HQL使用“?”来定义参数的位置,这里的hql语句定义了一个参数,第一个参数的位置为‘0’。接下来使用query.setString(0,”%C++%”);方法设置参数的值。setString()方法中,第一个参数表示HQL语句中参数的位置,第二个参数表示HQL语句中参数的值。这里给参数赋值时,使用“%”通配符,匹配任意类型和任意长度的字符串。如果HQL语句有多个参数,可以依次进行赋值。 query还提供了一些给参数赋值的方法: query还提供了一些给参数赋值的方法: 方法名 说明 setDate() 给映射类型为Date的参数赋值 setDouble() 给映射类型为double的参数赋值 setBoolean() 给映射类型为boolean的参数赋值 setInteger() 给映射类型为int的参数赋值 setTime() 给映射类型为Date-time的参数赋值

2.2.2 按参数名字查询 按参数名字查询时,需要在HQL语句中定义命名参数,且命名参数需要以“: ”开头。 example 4

/**
     * 参数查询,按参数名字查询
     */
    public void testHql_4(){
        Session session=HibernateSessionFactory.getSession();
        //通过":bookTitle"定义命名参数"bookTitle"
        String hql="from Books books where books.title=:bookTitle";
        Query query=session.createQuery(hql);
        //给命名参数设置值
        query.setString("bookTitle", "C++ Primer中文版");
        List list=query.list();
        Iterator itor=list.iterator();
        while(itor.hasNext()){
            Books book=(Books)itor.next();
            System.out.println(book.getTitle()+"      "+book.getAuthor()+"       "+book.getContentDescription());
        }
    }

当然在example 4中也可以用按参数位置查询(?)的方式。 在HQL语句中设定查询条件时,可以使用如下的各种运算。 在HQL语句中设定查询条件时,可以使用如下的各种运算。 类型 HQL运算符 比较运算 =、<>、>、>=、<、<=、is null、is not null 范围运算 in、not in、between、not between 逻辑运算 and、or、not 模式匹配 like

2.3 连接查询 HQL支持各种连接查询,例如,内连接、外连接和交叉连接等。 下面介绍一种常用的隐式内连接。 example 5

/**
     * 连接查询
     */
    public void testHql_5(){
        Session session=HibernateSessionFactory.getSession();
        //编写HQL语句,使用连接查询
        String hql="select b from Books b,Publishers p where b.publishers=p and p.name='清华大学出版社'";
        Query query=session.createQuery(hql);
        List list=query.list();
        Iterator itor=list.iterator();
        while(itor.hasNext()){
            Books book=(Books)itor.next();
            System.out.println(book.getTitle()+"      "+book.getAuthor()+"       "+book.getContentDescription());
        }
    }

2.4 分页查询 批量查询时,在单个页面上显示所有的查询结果会存在一定的问题,因此需要对查询结果进行分页显示。query接口提供了用于分页显示查询结果的方法。 (1)setFirstResult(int firstResult):设定从哪个对象开始查询,参数firstResult表示这个对象在查询结果中的索引(索引的起始值为0)。 (2)setMaxResult(int maxResult):设定一次返回多少个对象。默认时,返回查询结果中的所有对象。 example 6-1

/**
     * 分页查询
     */
    public void testHql_6(){
        Session session=HibernateSessionFactory.getSession();
        //按书名升序查询图书对象
        String hql="from Books b order by b.title asc";
        Query query=session.createQuery(hql);
        //从第一个对象开始查询
        query.setFirstResult(0);
        //从查询结果中一次返回3个对象
        query.setMaxResults(3);
        //执行查询
        List list=query.list();
        //遍历查询结果
        Iterator itor=list.iterator();
        while(itor.hasNext()){
            Books book=(Books)itor.next();
            System.out.println(book.getTitle()+"      "+book.getAuthor()+"       "+book.getContentDescription());
        }
    }

分页查询是系统中常用的功能,为了方面调用。可以编写以下方法: example 6-2

public void pagedSearch(int pageIndex,int pageSize){
    Session session=HibernateSessionFactory.getSession();
    String hql="from Books b order by b.title asc";
    Query query=session.createQuery(hql);
    int startIndex=(pageIndex-1)*pageSize;
    query.setFirstResult(startIndex);
    query.setMaxResults(pageSize);
    List list=query.list();
    Iterator itor=list.iterator();
    while(itor.hasNext()){
        Books book=(Books)itor.next();
        System.out.println(book.getTitle()+"      "+book.getAuthor()+"       "+book.getContentDescription());
    }
}

2.5 聚集函数 在HQL语句中可以使用的聚集函数包括: 函数 说明 count() 统计记录总数 min() 计算最小值 max() 计算最大值 sum() 计算和 avg() 计算平均值


example 7

/**
     * 聚集函数
     */
    public void testHql_7(){
        Session session=HibernateSessionFactory.getSession();
        //统计记录总数
        String hql1="select count(b) from Books b";
        Query query1=session.createQuery(hql1);
        Long count=(Long)query1.uniqueResult();     
        //统计书的平均金额
        String hql2="select avg(b.unitPrice) from Books b";
        Query query2=session.createQuery(hql2);
        Double money=(Double)query2.uniqueResult(); 
        //统计最贵和最便宜的图书
        String hql3="select min(b.unitPrice),max(b.unitPrice) from Books b";
        Query query3=session.createQuery(hql3);
        Object[] price=(Object[])query3.uniqueResult();
        System.out.println("记录总数"+count.toString()+"  平均金额"+
                money.toString()+"  书价最低为"+price[0].toString()+
                "  书价最高为"+price[1].toString());     
    }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年10月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档