在敲SSH过程中,对于Dao层的查询方法接触了“hql查询”、“离线查询”和“命名查询”,对数据库持久化操作使用更多的是hql方式查询,现对其总结。
一、Hql是什么?
Hql全名Hibernate Query Language,显然它是一种查询语言。一个ORM框架是建立在面向对象的基础上的。虽然HQL的语法类似于SQL,但实际上它的查询目标是对象。HQL拥有面向对象语言的所有的特性,这其中包括多态、继承和组合。这就相当于一个面向对象的SQL。
二、hql和sql的比较
HQL在结构上更接近SQL语句查询语法;
[select/delete/update…][from…][where…][groupby…][having…][order by…]
sql ---面向数据库表查询
hql ----面向对象查询
hql: from后面跟的类名+类对象 where后用对象的属性做条件
sql: from后面跟的是表名 where后用表中字段做条件
三、Hql的用法
(1)实体查询
因为hql面向兑现查询,实体查询则是将相关实体的所有属性进行查询
//直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段
String hql = "from Users";
Query query = session.createQuery(hql);
List<Users> users = query.list();
for(Users user : users){
System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());
}
//输出结果为:
//name1 : password1 : 1
//name2 : password2 : 2
//name3 : password3 : 3
一句:hql="from User",表示通过映射之后,将User这个实体整个查询出来。
(2)属性查询
//查询其中几个字段
String hql = " select name,passwd from Users";
Query query = session.createQuery(hql);
//默认查询出来的list里存放的是一个Object数组
List<Object[]> list = query.list();
for(Object[] object : list){
String name = (String)object[0];
String passwd = (String)object[1];
System.out.println(name + " : " + passwd);
}
//输出结果为:
//name1 : password1
//name2 : password2
//name3 : password3
通过加入"select name,password from Users"可知,此时返回出来的则是User这个实体当中的两个对象,name对象和password对象。
四、小结
上述例子中仅仅针对hql的查询从最简单的两个方面(实体查询和属性查询)来说明,其实hql的使用很深,会在对于hibernate深入学习过程中给出总结。但HQL还有一点需要注意一下:
HQL并不区分字母的大小写,但在HQL中的Java类和属性名必须和实际的类和属性名一致。如SELECT和select之间可以互换,但User和user却代表不同的含义。
示例:
String hql = "from Users";
String hql = "FrOm user";
这两句代表从不同的实体中进行查询。