hibernate 中HQL语句查询学习
本章介绍了Hibernate的几种主要检索方式:HQL检索方式、QBC检索方式、SQL检索方式。HQL是Hibernate Query Language的缩写,是官方推荐的查询语言。QBC是Query By Criteria的缩写,是Hibernate提供的一个查询接口。Hibernate是一个轻量级的框架,它允许使用原始SQL语句查询数据库。
6.1 HQL基础
HQL是Hiberante官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询。可以使用HQL查询具有继承、多态和关联关系的数据。在检索数据时应优先考虑使用HQL方式。
6.1.1 默认数据库表和数据
在讲解本章时,在没有特殊说明时,用到的数据库均为joblog,也就是在第4章建立的数据库。joblog中添加了3个表:学生表student、课程表course和选课表sc。
学生表student中各字段的结构如图6-1所示,字段的中文含义在Comment列中。
图6-1 学生表的数据结构
学生表student中的数据如图6-2所示,没有特殊说明时,用到的均为这6条记录。
此处仍然使用在第4章建立的HibernateProject项目,但是这里新建了一个包hibernate.ch06,这个包存放本章中的所有代码。在hibernate.ch06包中建立学生表对应的持久化类Student.java,代码如下。
图6-2 学生表中的数据
package hibernate.ch06;
//学生类
public class Student {
private Integer id; //对象标识符
private Integer sno; //学号
private String sname; //姓名
private String ssex; //性别
private String sdept; //所在系别
private Integer sage; //年龄
private String saddress; //籍贯
…… //省略了所有的get/set访问器
}
课程表course中的各个字段的结构如图6-3所示,字段的中文含义在Comment列中。
图6-3 课程表的结构
课程表中的数据如图6-4所示,如果没有特殊说明,用到的均为这4条记录。
图6-4 课程表的数据
在hibernate.ch06中新建持久化类Course.java类,代码如下。
package hibernate.ch06;
//课程类
public class Course {
private Integer id; //对象标识符
private Integer cno; //课程号
private String cname; //课程名
private Integer Ccredit; //学分
…… //省略了get/set访问器
}
选修表sc(sc为student-course的缩写)的结构如图6-5所示,字段的中文含义在Comment列中。
图6-5 选修表的结构
选修表中的数据如图6-6所示,没有特殊说明时,用到的均为这5条记录。
图6-6 选修表的数据
在hibernate.ch06中新建持久化类SC.java,SC.java的代码如下。
package hibernate.ch06;
//选课类
public class SC implements java.io.Serializable {
private Integer id; //id
private Integer sno; //学号
private Integer cno; //课程号
private Integer grade; //成绩
public SC() {
}
…… //省略get/set访问器
}
后面的章节中将用这3个表和3个持久化类进行讲解。
6.1.2 检索类的所有对象
使用HQL语句可以检索出一个类的所有对象,如HQL语句“from Student”表示检索Student类的所有对象。下面的程序检索学生类的所有对象。
Query query=session.createQuery("from Student"); //创建Query对象
List list=query.list(); //执行查询
//以下代码做显示用,以后不再写出来
Iterator it=list.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println("id"+stu.getId());
System.out.println("name"+stu.getSname());
System.out.println("/n");
}
session.createQuery()以HQL查询语句为参数,生成一个查询对象。本例中的HQL语句为“from Student”,这是from子句,格式如下。
from 类名
其中,类名可以为类的全限定名,如:
from hibernate.ch06.Student
Hibernate使用自动引入功能(auto import),会自动寻找需要的类,所以不推荐使用类的全限定名。注意,类名区分大小写,如果写成from student,将会抛出以下异常。
java.lang.NoClassDefFoundError: hibernate/ch06/student (wrong name: hibernate/ch06/Student)
HQL关键字不区分大小写,FROM、from和From是一样的。
调用query.list()时,真正开始执行HQL查询语句,并把查询的结果放在List中。
本例中查询的是Student类中的所有属性,如果查询Student类中的某一个或某几个属性,如查询所有学生的姓名和所在系,需要用到属性查询。
6.1.3 检索类的某几个属性
与SQL语句类似,HQL语句可以检索类的某一个或者某几个属性。以下代码查询所有学生的姓名和所在系。
//创建Query对象
Query query=session.createQuery("select Student.sname,Student.sdept from Student");
List list=query.list();
//执行查询
//以下代码显示查询的信息
Iterator it=list.iterator();
while(it.hasNext()){
Object[] stu=(Object[])it.next();
System.out.println("id"+stu[0]);
System.out.println("name"+stu[1]);
System.out.println("/n");
}
属性查询使用select关键字,属性查询的格式如下。
select 属性1,属性2,… from 类名
属性前可以加上类名加以限定,如:
select 属性1,属性2,… from 类名
但一般没有必要。
属性查询区分大小写,上面的代码中如果写成:
select SNAME,Sdept from Student
将抛出异常,提示找不到属性SNAME和属性Sdept。
查询结果将只显示查询的属性列。
属性查询的结果,对于用it.next()获得的每条记录,可以存储在Object[]数组中,以便进行存取。
6.1.4 指定别名
在查询时,可以用关键字as指定查询的别名,指定别名可以简化查询,有时必需指定别名才能进行查询。以下代码查询学号中含有4的学生的姓名和所在系。
select s.sname,s.sdept from Student as s where s.sno like '%4%'from Student s
s就是类Student的别名。注意as可以省略,即下面的查询语句和上面的语句是等效的。
select s.sname,s.sdept from Student s where s.sno like '%4%'from Student s
6.1.5 where条件子句
where条件子句跟SQL中的where条件子句类似,它检索符合条件的对象。例如,查询所有所在系别为计算机系的学生:
select s.sname,s.sdept from Student s where s.dept=’计算机’
where子句指定查询的条件,其语法和SQL类似。
在where子句中可以指定比较运算符:>、>=、<、<=、<>,其含义分别为大于、大于等于、小于、小于等于、不等于。
查询年龄在22到23岁的学生:
from Student s where s.sage>=22 and s.sage<=23
在where子句中指定查询的属性是否为null:is null、is not null,其含义分别表示为空和不为空。
查询所在籍贯为空的学生:
from Student s where s.saddress is null
6.1.6 使用distinct过滤掉重复值
使用distinct关键字将去掉结果中的重复值,只检索符合条件的对象。如下面的例子检索学生实例中的不重复的年龄。
Session session=HibernateSessionFactory.currentSession(); //创建Session
String hql="select distinct s.sage from Student s"; //HQL查询语句
Query query=session.createQuery(hql); //创建查询
List list=query.list(); //执行查询
检索的结果如下,可见结果中去掉了一个重复的22岁。
相关推荐
在WebLogic 12环境中部署应用程序时,如果应用依赖于特定版本的Hibernate框架,并且该版本与WebLogic服务器默认提供的Hibernate版本存在差异,则可能会导致`org.hibernate.hql.ast.HqlToken`类冲突。此类冲突主要...
hibernate-HQL语句大全
对hibernate的hql进行了详尽的讲解
2. 避免在HQL中使用SQL函数:尽量用Hibernate提供的函数,以确保跨数据库兼容性。 3. 优化查询性能:合理设计数据库索引,避免全表扫描,尽量减少JOIN操作。 总之,Hibernate-HQL是Java开发中处理数据库查询的重要...
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...
"Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...
### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...
对Hibernate中HQL语句的讲解
Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...
- `setString(String paraName, String value)`:设置HQL中通过`:paraName`指定的参数值。 - **list()**:执行查询并返回查询结果列表。 - **executeUpdate()**:执行更新或删除操作。 #### Select子句 - **...
本文将重点介绍Hibernate中的关联查询,并深入探讨HQL关联查询的实现原理及应用场景。 #### 二、数据库表连接概述 在理解Hibernate HQL关联查询之前,我们需要先回顾一下数据库表连接的基本概念及其分类。数据库表...
【描述】:在ORM框架Hibernate中,数据查询和检索是一个核心功能,它提供了多种查询方式,包括标准化对象查询(Criteria Query)、Hibernate查询语言(HQL)和原生SQL查询。其中,HQL作为官方推荐的查询方式,具有...
hibernate3-hql.jar .
Hibernate是一款强大的...总的来说,Hibernate的HQL jar是Java开发中用于简化数据库操作的重要组件,结合Hibernate框架,可以极大地提高开发效率和代码质量。理解并熟练使用HQL,可以让你在Java ORM领域更上一层楼。
通过上述介绍,我们可以了解到 HQL 在 Hibernate 中的重要性和实用性。它不仅提供了简洁易用的语法,还支持多种复杂的查询操作。对于初学者来说,掌握 HQL 的基本用法是非常重要的,这有助于更好地理解和应用 ...
hibernate hql 语法学习的文档
在HQL中,我们可以使用`like`关键字来进行模糊查询。`like`关键字后面可以跟一个包含通配符的字符串。常见的通配符有: - `%`:代表零个、一个或多个任意字符。 - `_`:代表一个任意字符。 例如,如果我们有一个`...
**hibernate-HQL用例** ...通过深入学习并实践这些HQL用例,开发者可以更好地理解如何在Hibernate中有效地操作数据库,提升开发效率。在实际项目中,熟练运用HQL能够使代码更加简洁,降低维护成本。