Hibernate 之 HQL
通过对Hibernate框架的学习,已经慢慢的对Hibernate有了进一步的了解,接下来我们要说的是HibernateQusery Language(HQL),如果你正在学习SSH框架,那SQL对你来说也是不陌生的,通过学习会发现HQL跟SQL有很多的相似之处.
在学习的过程中通过对比找到两个知识点的联系,包括相同点和不同点,通过重点学习那些不同点将会大大减少我们学习的成本.因为HQL跟SQL有很大的相似处,尤其是语法,所以HQL的学习建立在SQL的基础之上,那对HQL的掌握变非常容易.
HQL和SQL不同点
第一点(从宏观的角度)
SQL是基于关系型数据库模型,没有面向对象的特点,而HQL是面向对象编程跟数据库关系的组合.因为这个不同点即HQL所具有的面向对象的特点.便有了接下来的不同之处.
第二点(操作内容):
SQL更关注存在数据库中的表,并对表的一些操作,而HQL更关心对象及其属性的操作.
第三点(处理的关系):
SQL更多处理的是表和表之间的关系,HQL则是处理对象之间的关系.
以上的对比是从一个宏观的角度对他们的对比,接下来我们将会从HQL具体的语法和简单的运用来逐渐掌握了HQL的基本用法.
- 需要说明的是在hql中关键字是不区分大小写,通常小写但是类的名称和属性名称必须区分大小写,因为面向对象的特征.
- 例如:fromStudent s where s.id<2跟fromStudent s where s.ID<2是不一样的.
- from子句
- 例如:HQL的"from Student".相当于Sql的"select * from Student"从这点可以看出来HQL比SQL简洁了一些.
- 带参数查询(两种查询方式)
采用?方式,查询学号为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.