Hibernate 之 HQL

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

Hibernate 之 HQL

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

HQLSQL不同点

第一点(从宏观的角度)

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

第二点(操作内容):

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

第三点(处理的关系):

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

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

需要说明的是在hql中关键字是不区分大小写,通常小写但是类的名称和属性名称必须区分大小写,因为面向对象的特征. 例如:fromStudent swhere s.id<2fromStudent swhere 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.