在使用Hibernate的过程中,发现对数据库的查询语句并不能熟练的掌握,故查阅相关资料,对HQL的检索方式进行的总结。以下是常用方法的总结:
1.1 简介
HQL(Hibernate Query Language)查询语言是面向对象的查询语句,也是Hibernate中最常用的。其中语法和SQL语法有些相似,功能十分强大,几乎支持除特殊SQL扩展外的所有查询功能。
1.2 HQL的基本语法
HQL检索方式与SQL相似,使用方法基本相同,但HQL是面向对象语言,其查询的目标为对象,而SQL查询的目标则为数据表;除此之外,在书写HQL语句是要注意,它对大小写是敏感的。基本语法格式如下:
select “属性名” from “对象”
where “条件”
group by “属性名” having ”分组条件”
order by “属性名” deec/asc
从上述基本语法中可以看出,HQL与SQL的用法基本是一样的,但要注意,在使用HQL时在头脑中一定要有对象的概念。例如:select * from User u where u.id>10 order by u.id desc
此语句将查询User对象所对应数据表中的记录,条件为id》10,并将返回的结果按id的降序进行排序,语句中User为对象。
1.3 实体对象查询
在HQL查询语句中,如果直接查询实体对象,不能使用select *子句形式,但可以使用“from 对象”的形式进行查询,例如:from User
上述HQL语句意味着查询User对象所对应数据表中的所有记录,使用此语句可以获取已封装好的User对象的集合。
1.4 动态实例化对象查询
在数据查询过程中,当数据表中存在大量字段时,如果通过select *的形式将所有字段都查询出来,将会对性能方面造成一定的影响。在HQL中,可以通过只查询所需要的属性进行查询。例如:Select id,name from User
上述HQL语句中只查询了User对象中的id与name属性,可以避免查询数据表中的所有字段而带来的性能方面的问题。但在Hibernate中,此语句返回的却是Object类型的数组,它失去了原有的对象状态,破坏了数据的封装性。要解决此问题,可以通过动态实例化对象查询。例如:select new User(id,name) from User
这种查询方式通过new关键字对实体对象动态实例化,它可以对数据做出封装。例如:
session = HibernateUtil.getSession();
session.beginTransaction(); //开启事务
//HQL语句
String hql = "selectnew User(id.name from User)";
Query query =session.createQuery(hql);
list = query.list(); //获取查询结果
session.getTransaction().commit(); //提交事务
1.5 条件查询与别名使用
对于条件查询,在HQL语句中通过where子句来实现。例如: from User where id=1
上述语句用于实现查询id为1的User对象。
为了明确区分对象与对象中的属性,HQL提供了以下使用对象别名的方法:
①、from User u where u.id = 1
②、from User as u where u.id=1
1.6 HQL语句的动态赋值
1.6.1“?”号代表参数值
此种方式与PreparedStatement极其相似,通过Query对象的setParamenter()方法进行赋值,在HQL语句中以“?”号代表参数。例如查询id为3的User
对 象,可以使用以下方法:
//HQL语句
String hql = " from Useru where u.id = ?";
Query query =session.createQuery(hql); //创建Query对象
query = session.setParameter(0,3); //HQL参数赋值
list = query.list(); //获取查询结果
1.6.2 自定义参数名称
此种方式通过Query对象的setParamenter()方法进行赋值,但HQL语句中的参数可以自定义,它通过“:”号与自定义参数名组合的方法实现。例如查询id为
3的User对象,可以使用以下方法:
//HQL语句
String hql = " from Useru where u.id =:userId";
Query query =session.createQuery(hql); //创建Query对象
query = session.setParameter(“userId”,3); //HQL参数赋值
list = query.list(); //获取查询结果
1.7 对象导航查询
HQL查询语言符合Java程序员的编程习惯,查询过程都以对象的方式进行操作,当一个对象与另一个对象存在依赖关系是,可以通过“.”符号进行导航。例如:
session = HibernateUtil.getSession();
session.beginTransaction(); //开启事务
//HQL语句
String hql = "fromMedicine m where m.category.name=?";
Query query =session.createQuery(hql);
query = session.setParameter(0,”感冒药”); //HQL参数赋值
List list =query.list(); //获取查询结果
session.getTransaction().commit(); //提交事务
以上是我认为比较常用的HQL检索方式的部分总结,这些方法在实际的项目中都尝试过,但在操作过程中只利用HQL进行查询操作,未进行其他操作(update、delete)。