HQL单表查询 ---- Hibernate之查询语句

Posted 轻风暖云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HQL单表查询 ---- Hibernate之查询语句相关的知识,希望对你有一定的参考价值。

叙:在hibernate框架中查询数据库的语句主要分为HQL、QBC、SQL这三种,各有各的特点,使用的情况也不尽相同,之前关于HQL查询方式的也有一些学习,但是并不全面,今天本章节轻风就HQL(Hibernate Query Language)查询语句进行了详细的学习;


HQL查询数据

本章节主要学习的是HQL查询方式的单表查询,多表查询在下一章节学习记录;

HQL介绍

HQL(Hibernate Query Language):是hibernate的数据查询方式,HQL是针对持久化对象的,它用来取得对象而不进行update、delete和insert等更新操作,是一种完全面向对象的查询方式,并且具备继承、多态和关联等特性,因此在里面的查询语句都是针对实体对象以及实体对象中的属性的,不要搞混了;

几种查询方式

1. 简单查询
此查询是hql的基本查询方式,没有任何修饰,查询所有一张表的所有数据
代码如下:

@Test
    /*
     * HQL的基本查询
     */
    public void demo1() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        // String sql1 = "from com.java.domain.Customer";//全类名书写
        String sql = "from Customer";// 简单书写
        Query cust = session.createQuery(sql);
        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

HQL数据查询是一面向对象的形式,因此,sql=”from Customer”;这句中的Customer是实体对象的名称,而非数据库表的名表名,关于实体类名有两种书写方式,一种是全类名,即:从src到类名,这种写法是为了防止碰到相同类名的文件(一般情况下没必要这么写);第二种是直接写类名的简单书写,这种是最常用的;


2. 排序查询
排序查询和基本查询差别不大,主要是在查询的类名后边添加order by+排序依据的列名+排序方式,与sql语句的类似(asc是升序方式,desc是降序方式);

@Test
    /*
     *  排序查询
     */
    public void demo2() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql = "from Customer order by cust_id desc";// asc:升序    desc:降序
        Query cust = session.createQuery(sql);
        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

3. 条件查询
与sql语句类似,where后边加上根据哪个列进行条件查询,并通过占位符来进行查询;
占位符存在两种,一种是直接用问号,第二种是起代号,注意,起代号的方式需要在代号前加冒号;两种操作如下所示:

@Test
    /*
     * 条件查询
     */
    public void demo3() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        //String sql = "from Customer where cust_id=?";//通过问占位
        String sql1 = "from Customer where cust_id=:id ";//通过“代号”占位
        Query cust = session.createQuery(sql1);
        //cust.setParameter(0, 2l);//通过问号占位的从0开始排序
        cust.setParameter("id", 2l);
        List list = cust.list();
        System.out.println(list);

        bt.commit();
        session.close();
    }

问号占位符需要在setparameter中从0开始排序,
代号占位符需要在setparameter中先写代号,再写条件查询的条件值;


4. 分页查询
分页查询只需要两个关键字,setFirstResults()和setMaxresults(),第一个是起始索引值,第二个每页最大显示数据条数; (起始索引值 = (当前页数-1)* 每页显示条数)

@Test
    /*
     * 分页查询
     */
    public void demo4() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql = "from Customer";
        Query cust = session.createQuery(sql);
        //limit ?,?    索引起始 = (当前页数-1)* 每页要显示的数据条数
        cust.setFirstResult(2);//起始索引
        cust.setMaxResults(2);//每页显示条数

        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

5. 统计查询
统计查询重点在于关键字,这个关键字和排序查询一样,都在查询语句中,和分页查询的关键字不一样,分页查询的关键字是在代码中,不是在查询语句中;
主要的几个关键字:

  • count 统计
  • sum 求和
  • avg 平均数
  • max(min)最大值(最小值)

代码:

@Test
    /* 
     *统计查询
     */
    public void demo5() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql_count = "select count(*) from Customer";
        String sql_sum = "select sum(cust_id) from Customer";
        String sql_avg = "select avg(cust_id) from Customer";//获得的是double类型的返回值
        String sql_max = "select max(cust_id) from Customer";
        String sql_min = "select min(cust_id) from Customer";

        Query cust = session.createQuery(sql_avg);
        Number uniqueResult = (Number) cust.uniqueResult();
        System.out.println(uniqueResult);

        bt.commit();
        session.close();
    }

在关键字后的括号内填入根据实体对象的那个属性进行统计查询,不是根据数据库表的列名
接收转化的关键字需要注意,使用uniqueresult方法进行接收,Number类进行存放,Number类型的是封装的接收类,里面封装了各种数据类型的接收方法,直接使用就OK了。


6. 投影查询
投影查询就是查询一个表中某几个自己需要的字段数据,这个查询的好处就是能够简明快速的查询到自己想要的数据,不会浪费内存等资源;
在返回值方面需要注意,返回值是一个list类型的;

@Test
    /*
     * 投影查询
     * 
     */
    public void demo6() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql1 = "select cust_name from Customer";
        String sql2 = "select cust_id,cust_name from Customer";//这种显示效果不佳,一般不使用
        String sql3 = "select new Customer(cust_id,cust_name) from Customer";//需要在对应的Customer实体类中构造方法,创建无参构造
        Query cust = session.createQuery(sql3);

        List list = cust.list();
        System.out.println(list);

        bt.commit();
        session.close();
    }

查询单个字段属性时,直接将表中字段名对应的实体类的属性名写上即可,如果是查询多个而非表中所有时,直接以:
Select new 对象名(属性名1,属性名2,…) from 类名;
注意:此中的对象名的对象是需要在实体类名的类中进行构造的,并且要类中有对应的无参构造,以上面的sql3的查询语句为例,其在Customer类中的对象的构造以及无参构造如下所示:
技术分享图片 这个例子中主查询类是Customer,所以其返回值的范型是Customer,运行的结果如下图所示:
技术分享图片

从中可以看出,数据变成了一条一条的被放在以一个数据集合中;


pass:本章及学习记录了HQL查询方式的单表查询方式,下章才会把学习的HQL的多表查询方式上传上来,有需要的可以看看下一章
pass:pass:笔记是根据个人理解写出来的,有可能有理解不到位的地方,希望各位发现后可以告诉我,相互进步~


《本章完》


















以上是关于HQL单表查询 ---- Hibernate之查询语句的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate查询以及优化策略04

hibernate有几种查询方式

hibernate之HQL

Hibernate框架学习——查询-HQL语法

Hibernate 有哪几种查询数据的方式

hibernate查询有几种方式