HQL的概念和API

HQL的概念和API

HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL语言有些相似。在Hibernate提供的各种检索方式中,Hibernate是使用最广的一种检索方式。

HQL的功能

  • 在查询语句中设定各种查询条件

  • 支持投影查询,即仅检索出对象的部分属性

  • 支持分页查询

  • 支持连接查询

  • 支持分组查询,提供内置聚集函数

  • 能够调用用户定义的SQL函数

  • 支持子查询

  • 支持动态绑定参数

HQL的API

Session的 find() 方法以及 Query 接口都支持HQL查询。

find() 方法只是执行一些简单的HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在 Hibernate 3.x 版本中,已经淘汰了 find() 方法。

Query接口才是真正的HQL查询接口,它属于一个泛型接口,使用时要指定具体的类型,此接口提供了 find() 方法列出的各种查询方法。在5.2.0版本的Hibernate中,我们打开开发包中 documentation->javadocs 目录可以查看 Hibernate 的API。在5.2.0这个版本我们能看到有两个Query接口,一个位于 org.hibernate 包下,一个位于 org.hibernate.query 包下,但是 org.hibernate.Query 已经用@deprecated注解,表示不赞成使用,而是推荐使用 org.hibernate.query.Query接口,实际上该接口继承了 org.hibernate.query 接口。

  • 创建Query对象:Query Session.createQuery(String queryString)

  • Query接口的常见方法

    • setParameter();

      为查询的SQL语言之中的占位符设置参数

    • List getResultList();

      返回一个查询的集合

    • Object uniqueResult();

      返回一个单一的查询结果

查询单一的数据对象

因为HQL是面向对象的查询语言,所以不需要指定具体的表和栏位,而是指定具体的实体类和属性,实际上我们在对象映射文件中做了相应的对应关系映射,所以说,原理上是一样的。

注意:导入的是org.hibernate.query.Query接口

首先使用 Session 对象的 createQuery() 方法来创建 Query 对象,因为 Query 是泛型接口,所以需指定具体的返回类型,除此之外,我们还需要在方法的参数中指定HQL语句和返回类型对应的class对象。

如果是查询单一的对象,那么需要使用 Query 的 uniqueResultOptional() 方法来返回 一个 java.util.Optional 接口对象,该接口的 get() 方法即可放回查询到的对象。

注意:此处对象中的属性并不是对象的成员变量,也就是说不是attribute而是property,是成员变量对应的getter/setter方法按规则去掉get/set之后得到的property name,当然,一般情况下,此property name和成员变量是相同的。

public void queryObject() {
        Session session = HibernateSessionFactory.getSession();
        Transaction trans = null;

        try {
            // 启动事务1
            trans = session.beginTransaction();

            /* 可以使用"?"指定所有类型参数,也可以具体的类型 */
            /*注意这里使用的是查询对象,以及对象的属性,而不是数据表和栏位,这就是面向对象查询,没有指定查询的具体属性就查询所有属性*/
            /*还需指定查询返回的对象的class类型*/
            Query query = (Query) session.createQuery("from Student where id='2016'", Student.class);
            /*单一结果查询,返回的是一个接口*/
            Optional optional = query.uniqueResultOptional();
            Student s = optional.get();
            System.out.println(s);

            System.out.println("******************************");

//          /*使用占位符*/
//          query=(Query) session.createQuery("from Student s where s.id=?", Student.class);
//          /*根据占位符位置设置参数,占位符从0开始*/
//          query.setParameter(0, "2015");

//          /*预留参数*/
//          query=(Query) session.createQuery("from Student s where s.id=:p", Student.class);
//          /*根据预留参数名字设置参数*/
//          query.setParameter("p", "2015");

            /*推荐使用*/
            /*给占位符指定索引位置(自己随意指定)*/
            query=(Query) session.createQuery("from Student s where s.id=?2", Student.class);
            query.setParameter(2, "2015");

            optional = query.uniqueResultOptional();
            s=optional.get();
            System.out.println(s);

            trans.commit();
        } catch (Exception e) {
            e.printStackTrace();
            trans.rollback();
        }
    }

查询一个数据集合

我们可以使用 Query 接口的 getResultList() 方法来返回一个 List集合。

    /*集合查询,返回的是一个List集合*/
    public void queryList() {
        Session session = HibernateSessionFactory.getSession();
        Transaction trans = null;

        try {
            // 启动事务1
            trans = session.beginTransaction();

            Query query=(Query)session.createQuery("from Student", Student.class);
            List list=query.getResultList();
            System.out.println(list);

            System.out.println("************");

            /*根据条件的集合查询*/
            query=(Query)session.createQuery("from Student where gender=?1 and age=?2", Student.class);
            query.setParameter(1, "female");
            query.setParameter(2, 20);
            list=query.getResultList();
            System.out.println(list);

            System.out.println("************");

            /*根据条件的集合查询*/
            query=(Query)session.createQuery("from Student s where s.name like ?1 and s.age, Student.class);
            query.setParameter(1, "L%");
            query.setParameter(2, 22);
            list=query.getResultList();
            System.out.println(list);

            trans.commit();
        } catch (Exception e) {
            e.printStackTrace();
            trans.rollback();
        }
    }

其他的HQL

/*其他的SQL语句*/
    public void otherSQL() {
        Session session = HibernateSessionFactory.getSession();
        Transaction trans = null;

        try {
            // 启动事务1
            trans = session.beginTransaction();

            /*查询数目,注意:返回的是一个Long类型*/
            Query query=(Query)session.createQuery("select count(*) from Student", Long.class);
            Optional optional=query.uniqueResultOptional();
            System.out.println(optional.get());

            System.out.println("*************");

            /*插询某一具体的属性(对应栏位)*/
            Query query01=(Query)session.createQuery("select name from Student", String.class);
            List list=query01.getResultList();
            System.out.println(list);

            trans.commit();
        } catch (Exception e) {
            e.printStackTrace();
            trans.rollback();
        }
    }

你可能感兴趣的:(Hibernate)