下面讲述HQL一些比较高级的应用,包括如何使用HQL查询继承关系数据、绑定参数和在配置文件中使用查询语句。
6.2.1 查询类及其所有继承的类的实例
默认情况下,当查询一个类时,Hibernate会自动搜索这个类的所有继承类。假如有如下3个类,类的关系如图6-7所示。
图6-7 Animal类及其子类Bird和Mammal
当调用如下HQL语句时,会查询出所有的Animal实例、Bird实例和Mammal实例。
from Animal
所有的类均继承自java.lang.Object,所以下面的HQL语句查询所有的类的对象实体,即查询所有映射表的记录。
from java.lang.Object
6.2.2 限制每次查询的返回对象数
Query接口提供了两个函数,用于限制每次查询返回的对象数。
SetFirstResult(int firstResult) 用于设置从哪一个对象开始检索。参数firstResult设置开始检索的起始记录。
setMaxResults(int maxResults) 用于设置每次检索返回的最大对象数。参数maxResults用于设置每次检索返回的对象数目。
这两个函数结合起来用,经常用于分页显示对象。例如数据库中有10000条记录,如果一次性显示实在太多,就可以进行分页显示。
下面的程序当每次循环时,从Student实例中检索出pageSize个对象,并输出到控制台,是一个典型的分页显示程序。
/**
* 分页输出对象
* @param pageSize 每页显示的记录条数
*/
public void pagenate(int pageSize)
{
Session session=HibernateSessionFactory.currentSession(); //创建Session
String hql="from Student"; //检索Student实例的HQL语句
String hql1="select count(*) from Student"; //检索出表中有多少条记录的HQL语句
Query q=session.createQuery(hql1); //创建Query
List list=q.list(); //执行查询
int count=((Integer)list.get(0)).intValue();//总的对象个数
int pageCount=(count+pageSize-1)/pageSize; //总的页数
Query query=session.createQuery(hql); //创建检索Student的查询
for(int i=0;i<pageCount;i++){
query.setFirstResult(i*pageSize);
query.setMaxResults(pageSize);
List list1=query.list(); //执行查询
Iterator it=list1.iterator();
System.out.println("***************************");
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getId()+"\t"
+stu.getSno()+"\t"
+stu.getSname()+"\t"
+stu.getSsex()+"\t"
+stu.getSage()+"\t"
+stu.getSdept()+"\t"
+stu.getSaddress()
);
}
}
}
pagenate(int pageSize) 函数对指定的对象实例循环查询,每次循环检索出pageSize个对象。
HQL语句select count(*) from Student检索出学生对象的个数,把对象个数存入到变量count中。
用(count+pageSize-1)/pageSize计算出总的页数。
每次for循环时输出一页的记录。
6.2.3 绑定参数
使用绑定参数可以在程序运行时动态决定一些参数的值。下面比较不使用绑定参数和使用绑定参数时的情况。
第4章的4.3.6节中,ViewLog.java中有一个检索指定时间段日志的HQL语句:
String HQL="from Contents where logdate>='"+beginDate+" 00:00:00' and logdate<= '"+endDate+" 00:00:00'";
上述做法存在以下缺陷。
代码的可读性比较差。
安全性问题,用户可能执行别的代码或存在SQL注入式攻击。
性能低下。
查询语句中以“:”开头的变量叫做命名参数,把命名参数和一个具体的值进行绑定的过程叫做绑定参数。如下面的程序。
//声明hql语句,待绑定的参数以":"开头
String hql="from Student where sname=:name and sage>:age"; //name和age为命名参数
Query query=session.createQuery(hql); //创建查询
query.setParameter("name","李晓梅"); //进行绑定
query.setParameter("age",new Integer(20));
List list=query.list(); //执行查询
对上述代码说明如下。
“:name”指定了命名参数name,“:age”指定了命名参数age。
调用Query接口的setParameter()为命名参数赋一固定值。第一个参数指定参数名称,第二个参数指定参数值。当明确知道参数类型时,则可以使用相应的方法,例如参数为int型,可以使用setInteger()方法;参数为String型,可以使用setString()方法。
可以使用按照参数位置对参数进行绑定,如下面的代码所示。
String hql="from Student where sname=? and sage>?"; //声明hql语句,命名参数用“?”代替
Query query=session.createQuery(hql); //创建查询
query.setParameter(0,"李晓梅"); //绑定参数
query.setParameter(1,new Integer(20));
List list=query.list(); //执行查询
在HQL语句中用问号“?”代替命名参数。此时setParameter()函数的第一个参数指定参数的位置(position),0为HQL查询语句中的第一个参数,1为第二个参数,以此类推。
6.2.4 在映射文件配置HQL语句
为了使程序具有更大的灵活性,Hibernate可以在映射文件中配置HQL语句。如下所示为在Student.hbm.xml中的配置。
<hibernate-mapping>
<class name="hibernate.ch06.Student" table="student" catalog="joblog">
<!--此处省略了配置-->
</class>
<query name="searchStudent"><![CDATA[
from Student s where s.sage>22
]]>
</query>
</hibernate-mapping>
可以用如下代码访问配置文件中的HQL语句。
Session session=HibernateSessionFactory.currentSession();//创建Session
Query query=session.getNamedQuery("searchStudent"); //用getNamedQuery得到查询
List list=query.list(); //执行查询
Iterator it=list.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getSname());
}
分享到:
相关推荐
L 的属性查询功能。属性查询允许我们仅获取实体对象的一部分属性值,而不是整个对象。...通过熟练掌握 HQL 的进阶用法,可以提升代码的可读性和维护性,同时减少与数据库交互的复杂性,提高开发效率。
3. **HQL进阶.docx**:这份文档可能涉及更高级的主题,如联接查询、子查询、集合操作、函数应用等,适合已经掌握HQL基础的读者深入学习。 4. **HQL的多表查询.docx**:这部分内容会详细解释如何在HQL中处理多表之间...
HibernaCte关联映射,HQL实用技术,HQL进阶,Criteria查询
#### 三、HQL进阶 ##### 3.1 查询类及其所有继承的类的实例 HQL支持多态性,因此可以查询基类及其派生类的对象: ```hql SELECT s FROM Student s WHERE s INSTANCE OF GraduateStudent ``` 此查询将返回所有`...
#### HQL进阶 ##### 查询类及其所有继承的类的实例 当需要查询某个类及其子类的实例时: ```hql SELECT e FROM Employee e WHERE e.class = Student; ``` 假设`Employee`是父类,而`Student`是其子类。 ##### ...
#### 1.2 HQL进阶 ##### 1.2.1 查询类及其所有继承的类的实例 - **语法**: ```hql SELECT s FROM Student s WHERE s INSTANCE OF GraduateStudent; ``` - **解释**: 查询`Student`类及其子类`GraduateStudent`的...
三、HQL模糊查询的进阶使用 1. **使用`in`关键字**:如果需要查询符合多个条件的记录,可以结合`in`关键字。例如,查询所有名字以"张"或"李"开头的用户: ```java String[] names = {"%张%", "%李%"}; query....
#### 五、进阶技巧 - **分页查询**:可以使用 `setFirstResult` 和 `setMaxResults` 方法实现分页查询。 - **排序**:通过添加 `order by` 子句来指定排序规则。 - **连接查询**:可以使用 `join` 关键字进行连接...
#### 五、进阶查询 除了基本的查询之外,HQL 还支持更复杂的查询,例如连接查询、子查询以及分页查询等。 1. **连接查询** - 使用 `JOIN` 关键字进行连接查询。 - 示例:查询所有用户的订单信息。 ```java ...
Hibernate Query Language(HQL)是Hibernate框架中...通过文档《HQL语法入门学习.doc》和《HQL语句大全.txt》,可以系统地了解和掌握HQL的各种用法,而《HQL》可能是实际的代码示例或进阶话题,进一步巩固理论知识。
### HQL经典语句大全详解 #### 一、HQL简介及基本语法 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者使用类...掌握这些基础和进阶的知识点对于高效地使用Hibernate进行数据操作至关重要。
12. **JPA与Hibernate**:了解ORM(对象关系映射)技术,掌握JPA规范以及其实现之一Hibernate的使用,包括CRUD操作、查询语言HQL和 Criteria API。 13. **性能优化**:学会分析和优化Java程序性能,使用JProfiler或...
《Hibernate 进阶教程》是一本专为对Hibernate有初步了解并希望深入学习的开发者准备的手册。Hibernate作为Java领域中最流行的持久化框架之一,它极大地简化了数据库操作,使得开发者能够更专注于业务逻辑,而非繁琐...
根据提供的文件信息,以下是有关Hadoop入门进阶课程中Hive介绍和安装部署的知识点: 1. Hive介绍: - Hive是Facebook开发的数据仓库工具,运行于Hadoop集群之上。 - 提供类SQL的HQL(Hive Query Language)查询...
本主题“基于Spring与Hibernate的数据库操作进阶”将深入探讨如何利用这两个框架进行高级的数据库交互。 首先,Spring是一个开源的Java平台,它简化了应用程序的开发,并提供了全面的框架支持,包括依赖注入(DI)...
《Hibernate进阶之路:深入解析相关jar包》 在Java世界中,Hibernate作为一个优秀的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨与Hibernate进阶之路相关的jar包,帮助开发者理解这些核心组件...
Hibernate则会让学习者理解如何通过实体类和映射文件进行数据库操作,以及事务管理和HQL查询语言的应用。 在实践中,这个项目可能会包含用户登录、注册、客户信息管理、订单处理等功能,这些都是Web应用开发中的...
以下是针对《JavaEE框架技术进阶式教程》教学资料的详细知识点介绍: 1. **Servlet与JSP** - Servlet是JavaEE中的核心组件,用于处理HTTP请求。学习Servlet的生命周期、部署描述符以及如何通过HttpServlet进行响应...
本篇文章主要关注Spring Data JPA在项目中的核心场景与进阶用法,旨在帮助开发者更高效地利用这个框架。 首先,Repository 是Spring Data JPA的核心组件,它为数据访问提供了一种声明式的方法。Repository接口层级...