一,简介
Hql全称Hibernate Query Language,是以对象的方式进行查询,将查询语句封装为对象操作,是完全的面向对象的查询语句。具备多态、关联等特性。
优点:可读性好,符合Java程序员的变成习惯。
缺点:不够成熟,调试不灵活。
常用规则:在hql语句中,不区分大小写,但是类和属性名称,必须区分大小写。
二,常用属性如下
完整的sql的语句形式和如下;
select/Update/delete.... from...iwhere.... group by.... having.... order by ....asc/desc
其实hql和sq语句上很多地方都相同,掌握了slq完整的语法形式,hql就很容易上手了,注意下不同即可。
三,常用详细介绍
1,单一属性查询
返回结果集属性列表,元素类型和实体类中相应的属性一致
2,多个属性查询
返回集合中的元素是object数组,其中数组元素的类型和对应属性在实体类中的类型一致
/*//2查询多个属性,返回对象数组集合
//数组元素的类型和查询的属性类型一致,数组的长度和Select中查询的属性个数一致
List students = session.createQuery("select name,id from Student").list();
for(Iterator iter = students.iterator();iter.hasNext();){
Object[] obj = (Object[])iter.next();
//打印出第一个和第二个
System.out.println(obj[0]+","+obj[1]);
}*/,
3,参数绑定
Hibernate对动态参数查询提供了丰富的支持,主要的有2种。
(1)占位符绑定,也叫按参数位置绑定
Hql中查询语句用“?”来定义参数位置。
org.hibernate.Query query = session.createQuery("select s.name,s.id from Student s where s.name like ?");
query.setParameter(0,"%0%");
List students = query.list();
第一个参数代表绑定的参数在hql语句中出现的位置编号(从0开始编号),第二个参数代表参数实际值。
在开发中,提供使用按照名称绑定参数,因为可以提供好的程序可读性,而且提高程序的易维护性。因为查询参数的位置发生改变时,按照名称绑定参数的方式是不需要调整代码顺序的。但是参数位置绑定这个时候,就会乱套了。
优化:
将上述代码方法修改成为链式样式,更加简单明了,建议采用这种方式。
//方法连变成,建议采用这种方式
List students = session.createQuery("select s.name,s.id from Student s where s.name like ?")
.setParameter(0, "%0%")
.list();
(2)参数名称绑定
在HQL语句中定义参数要用“:”开头,形式如下:
//可以采用参数名的范式传递参数
List students = session.createQuery("select s.name,s.id from Student s where s.name like :name")
.setParameter("name", "%0%")
.list();
上面的:name定义了参数名称name,然后通过setParameter设置参数值。?SetParameter包含两个参数,分别是命名参数名称和命名参数实际值。4,in子句
//用参数名称方式查询学号为1,2,3的学生
/* List students = session.createQuery("select s.name,s.id from Student s where s.id in(:ids)")
.setParameterList("ids", new Object[]{1,2,3,4,5})
.list();*/
5,可以使用mysql的一些常用函数
//用mysqls的DateFormat函数
/* List students = session.createQuery("select s.name,s.id from Student s where date_format(s.createTime,'%Y-%m')=?")
.setParameter(0, "2009-08") //第一个0是索引
.list();*/
6,分页查询 //Hiberante的分页代码
/* List students = session.createQuery(" from Student")
.setFirstResult(1)
.setMaxResults(2)
.list();*/
7,对象导航查询
一个实体中需要有另一个实体的对象集合或实体
如下:user实体中包含了Clsses(班级)的实体
public class Student {
private int id;
private String name;
private Date createTime;
private Classes classes;
//get和Set方法省略
}
如果想通过Student实体查询其所在的班级,可以用如下的hql语句。 //对象导航查询,因为一个对象中包含另一个对象,所以可以直接取其属性
//List students = session.createQuery(" from Student s where s.classes.name like '%班级2%'").list();
8,连接同样适用
//链接查询---内连接
//List students = session.createQuery("select c.name,s.name from Student s join s.classes c").list();
//左连接
//List students = session.createQuery("select c.name,s.name from Student s left join s.classes c").list();
//右链接
//List students = session.createQuery("select c.name,s.name from Student s right join s.classes c").list();
9,统计查询
/* //统计查询
List list = session.createQuery("select count(*) from Student s ").list();
//count返回是long
Long count=(Long)list.get(0);
System.out.println("count="+count);*/
10,分组查询
//分组查询:
String hql="select c.name ,count(s) from Classes c join c.students s group by c.name order by c.id";
List students = session.createQuery(hql).list();
for( int i=0;i<students.size();i++){
Object[] obj=(Object[])students.get(i);
System.out.println(obj[0]+","+obj[1]);
}
小结:
hql不太熟悉的是,参数查询、分页查询、对象导航查询,需要重点看,其他的sql中很熟悉,就当复习了。