Hibernate 之 HQL

 通过对Hibernate框架的学习,已经慢慢的对Hibernate有了进一步的了解,接下来我们要说的是HibernateQusery Language(HQL),如果你正在学习SSH框架,SQL对你来说也是不陌生的,通过学习会发现HQLSQL有很多的相似之处.

在学习的过程中通过对比找到两个知识点的联系,包括相同点和不同点,通过重点学习那些不同点将会大大减少我们学习的成本.因为HQLSQL有很大的相似处,尤其是语法,所以HQL的学习建立在SQL的基础之上,那对HQL的掌握变非常容易.

 

 

       HQLSQL不同点

      第一点(从宏观的角度)

              SQL是基于关系型数据库模型,没有面向对象的特点,HQL是面向对象编程跟数据库关系的组合.因为这个不同点即HQL所具有的面向对象的特点.便有了接下来的不同之处.

      第二点(操作内容):

                SQL更关注存在数据库中的表,并对表的一些操作,HQL更关心对象及其属性的操作.

      第三点(处理的关系):

                SQL更多处理的是表和表之间的关系,HQL则是处理对象之间的关系.

 

      以上的对比是从一个宏观的角度对他们的对比,接下来我们将会从HQL具体的语法和简单的运用来逐渐掌握了HQL的基本用法.     

 

  •  需要说明的是在hql中关键字是不区分大小写,通常小写但是类的名称和属性名称必须区分大小写,因为面向对象的特征.
    • 例如:fromStudent s where s.id<2fromStudent s where s.ID<2是不一样的.
  •  from子句
    • 例如:HQL"from Student".相当于Sql"select * from Student"从这点可以看出来HQLSQL简洁了一些.
  •  带参数查询(两种查询方式)

采用?方式,查询学号为1,2的学生

Liststudents = session.createQuery("select s.id, s.name from Student s wheres.id in(?, ?, ?, ?, ?)")

.setParameter(0,1)

.setParameter(1,2)

.list();

采用 :参数名方式,查询学号为1,2的学生

Liststudents = session.createQuery("select s.id, s.name from Student s wheres.id in(:ids)")

.setParameterList("ids",new Object[]{1, 2})

.list();

 

  •  查询数量(查询所有学生数目)
    • Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();
    • 另一种查询方式

Longcount = (Long)session.createQuery("select count(*) from Student")

                                        .setMaxResults(1)

                                        .uniqueResult();

 

  • HQL中查询原生sql语句
    • List students = session.createSQLQuery("select * from t_student").list();
  • 分页查询

Liststudents = session.createQuery("from Student")

.setFirstResult(1)

.setMaxResults(2)

.list();

 

  • ……

 

         以上是对HQL的一些基本的介绍,建议在进行Hibernate的过程中可以在Hibernate核心配置文件配上以下属性:

        <propertyname="hibernate.show_sql">true</property>

        这样在程序执行HQL语句时可以看到具体的Sql执行情况.通过查看Sql的执行情况我们也会看到Hibernate存在的一些问题,例如N+1问题.

        希望通过以上的内容能够对HQL有个基本认识,接下来还需要在实践中提高.

 

        HQL的一句话总结为:面向对象的SQL.

 


原文地址:https://www.cnblogs.com/baoendemao/p/3804810.html