Hibernate下的HQL(Hibernate Query Language)语言是一种类SQL语言,在Hibernate框架下,HQL语言结合自己API,可以实现对数据库的操作,本文简单的记录下HQL语言的简单用法,后续在工作和学习的过程中再补充。
HQL与SQL的区别
两者的语法不一样,SQL是操作的数据库,而HQL语言是一种类SQL语句,它语法跟SQL很相似,但是不能操作数据库,也只能用部分SQL的关键字。
SQL语法:SELECT 字段名 FROM 表名
HQL语法:SELECT 属性名 FROM 类名(不能使用SELECT * FROM 类名)
HQL常用的语法:
(1)FROM 类名,但是不支持SELECT *
(2)SELECT 属性 FROM 类名
可以使用HAVING,ORDER BY和GROUP BY等关键字。
如何使用HQL
使用HQL需要按照如下步骤来进行:
(1)获取session对象
(2)编写HQL语句
(3)创建Query查询对象,将HQL语句添加进去
(4)如果HQL中有查询参数,再使用setXxx设置查询参数
(5)调用Query对象的list方法得到查询结果,大牛建议不直接用list,使用Query对象的uniqueResult方法。
(6)关闭session
其中HQL语句关键字不区分大小写,但是实体类名和属性名区分大小写。
HQL使用案例
测试时省略Hibernate的配置,可以参考以前自己写的博客即可,下面直接下测试类中进行测试。
(1)使用HQL语句从student表中查找数据,查询无参数
//测试使用HQL语句从student表中查询数据,查询条件无参数 @Test public void testHQL() { //获取session对象 Session session=getSession(); //编写HQL语句 String hql="from Student";//from 类名 //创建Query对象,创建查询,并返回query结果 Query query=session.createQuery(hql); //调用Query对象的list方法返回查询结果集 List<Student> students=query.list(); for(Student s:students) { System.out.println(s); } //关闭session对象 session.close(); }
测试结果:
可以看出查询出了student表中的所有数据。
(2)使用HQL语句从student表中查找数据,查询时有参数,参数名前面需加冒号,为引用占位符。
//测试使用HQL语句从student表中查询数据,采用name进行查询 @Test public void testHQL1() { //获取session对象 Session session=getSession(); //编写HQL语句 String hql="from Student where name=:name"; //创建Query对象 Query query=session.createQuery(hql); //设置查询参数 query.setString("name", "messi"); //调用Query对象的list方法返回结果集 List<Student> students=query.list(); for(Student s:students) { System.out.println(s); } //关闭session session.close(); }
测试结果:
测试查询name为'messi'的一条记录,发现可以正常查询得到。
(3)测试使用HQL语句从student表中查询数据,并按照id倒序排列,主要是测试ORDER BY关键字。
//测试使用HQL语句从student表中查询数据,并按照id倒序排列 @Test public void testHQL2() { //获取session对象 Session session=getSession(); //编写HQL语句 String hql="from Student order by id desc"; //创建Query对象 Query query=session.createQuery(hql); //调用Query对象的list方法返回结果集 List<Student> students=query.list(); for(Student s:students) { System.out.println(s); } //关闭session session.close(); }
测试结果:
测试结果都是按照id倒序排列,因此ORDER BY关键字也是可以正常使用。
限于时间,其他更复杂的查询这里不深究了,如果以后工作上有需要再深入了解,待添加。
结论
HQL是Hibernate下的类SQL查询语句,其不直接查询数据库中的表,而是通过查询跟表有映射关系的实体类,来实现查询需求。