HQL查询语法

       前言

        Hibernate框架中独有的查询语法HQL(Hibernate Query Language),是一种面向对象的查询语言,其中没有表和字段的概念。只有类、对象和属性的概念。


编写HQL语句

        HQL语句中映射的查询名称首先对应的是Java类中的属性名。其次是数据库中的字段名。

  1. from子句

    Hibernate中最简单的HQL语句形式:

    (1)from cn.hibernatedemo.entity.Dept

    (2)from Dept as dept

    (3)from Dept dept

  2. select子句

    select子句用于选取对象和属性:

    (1)select dept.deptName from Dept as dept

    (2)select dept from Dept as dept

  3. where子句

    where子句用于表达查询的限制条件:from Dept where deptName = ‘SALES’

  4. 使用表达式

    表达式一般用在where子句中。以下两个HQL语句在where子句中分别使用了lower()函数和year()函数

    from Dept dept where lower(dept.deptName) = ‘sales’ :这条HQL语句用于查询名称sales的部门不区分大小写。

    from Emp where year(hireDate) = 1980 :用于查询1980入职的员工

  5. order by子句

    form Emp order by hirDate asc

    from Emp order by hireDate salay desc

  6. 执行HQL语句

       HQL语句准备好以后,执行HQL语句需使用代码构建Query对象

//定义HQL语句
String hql = "from Emp";
//构建Query对象
Query query = session.createQuery(hql);

Query对象构建好后,两种方式执行查询语句并获取查询结果。list()、iterate()

HQL语句中绑定参数
  1. 参数绑定形式

    • 按参数位置绑定

      Query query = session.createQuery("from Emp where job = ? and salary > ?"); 
      通过setXXX()方法绑定参数第一个参数下标位置为0;
      query.setString(0,job);
      query.setDouble(1,salary);
    • 按参数名称绑定

      在HQL语句中可以定义命名参数,命名参数以:开头

      Query query = sesison.createQuery("from Emp where job = :empJob and salary > :empSalery"); 
      通过setXXX()方法的重载绑定通过对应参数名进行绑定
      query.setString("empJob",job);
      query.setDouble("empSalery",salary);
    • 绑定各种类型的参数

      1.Query接口提供的绑定不同数据类型参数的方法

      setBoolean()
      setByte()
      setDouble()
      setDate()
      setString()
      
      //用于绑定任意参数使用Object类
      setParameter()
    • 实现动态查询

      在查询条件很多的情况下,传递过多的参数很不方便。可以吧参数封装在对象中,使用Query接口的setProperties()方法为HQL中的命名参数赋值。setProperties()方法会把对象的属性匹配到命名参数上。命名参数名称要与Java对象的属性匹配。

      当只需要返回一个值的时候可以使用uniqueResult()方法获取唯一结果


分页和投影
  1. 实现数据分页查询

        Hibernate提供了简便的方法实现分页,即通过使用Query接口的setFirstResult(int firstResult)方法和setMaxResults(int maxResults)方法实现。

 Query query = session.createQuery(hql);
query.setFirstResult(firstResult).setMaxResults(maxResults).list();
  1. 使用投影查询
            有时候数据展示并不需要获取对象的全部属性,而是只需要对象的某个属性,或需要通过表达式、聚合函数等方式得到某些结果、此时可以使用投影查询。投影查询需要使用HQL的select子句。

    • 每条查询结果仅包含一个结果列
    • 每条查询结果包含不止一个结果列
    • 将每条查询结果通过构造方法封装成对象