HQL: Hibernate Query Language, 一个纯面向对象的查询语言. 其语法中对语法关键字大小写不敏感, 这种特性与SQL语言类似.其整体结构也与SQL语言类似.
基本规则
1. HQL语法类似于SQL,也是一种select from结构的语句。但是他后面跟的不是表名和字段名,而是类名和属性名。
2. HQL基本查询语法跟SQL很类似
3. HQL大小写不敏感。但是,设计java类名、包名、属性名时大小写敏感。
4. 包名的使用情况。比如:如果注册的实体类Emp只有一个唯一的类,那么查询时可以不加包名,hibernate会自动检索到Emp类。但是如果注册多个实体类,名字都叫Emp。此时就要增加包名来区别多个实体类。
下面一些简单的案例来使用简单HQL语法
@Test
public void test() {
/**
* 采用HQL语句,后面写的是对象名
* sql : select * from tb_student;
* hql : from Student;
* 注意:
* 类名和属性名区分大小写
* 语法结构和sql类似
*/
//编写HQL语句
String hql = "from Student";
//创建query对象
Query query = session.createQuery(hql);
//执行查询
System.out.println("使用List集合查询");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student);
}
/*
* list方法和iterate方法的区别
* list发出一条sql语句,查询全部数据
* iterate发出一条sql语句,查询符合条件的id
* 当使用到对象就根据id查询此对象,发出另一条sql语句
* list会把数据存储到缓存中,但它不会利用缓存,每次都从数据库中查询
* iterate则会利用缓存(先查询符合条件的id,再根据id去缓存中查找对象,如果缓存中有此对象,则直接从缓存中取出此对象)
*
* 应用场景:
* list:数据量较小,数据是财务或实时数据
* 相反则使用iterate
*/
System.out.println("使用Iterate迭代器查询");
Iterator iterate = query.iterate();
while(iterate.hasNext()){
Student stu = (Student) iterate.next();
System.out.println(stu);
}
}
根据id查询学生-返回的是一个学生对象
@Test
public void getStudentById(){
String hql = "from Student where sid=1";
Query query = session.createQuery(hql);
Student stu = (Student) query.uniqueResult();
System.out.println(stu);
}
查询学生总人数-返回的是一条数据
@Test
public void getStudentCount(){
String hql = "select count(s) from Student s";
Query query = session.createQuery(hql);
long stu = (long) query.uniqueResult();
System.out.println(stu);
}
查询已成年的女学生-带条件
@Test
public void getStudentByWhere(){
String hql = "select count(s) from Student s where age>=16 and gender='女'";
Query query = session.createQuery(hql);
long stu = (long) query.uniqueResult();
System.out.println(stu);
}
查询学生的名字和年龄-返回的集合为list
@Test