`
wangichao
  • 浏览: 5070 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
最近访客 更多访客>>
社区版块
存档分类
最新评论

HQL进阶

阅读更多
下面讲述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());

        }

分享到:
评论

相关推荐

    HQL进阶语句

    L 的属性查询功能。属性查询允许我们仅获取实体对象的一部分属性值,而不是整个对象。...通过熟练掌握 HQL 的进阶用法,可以提升代码的可读性和维护性,同时减少与数据库交互的复杂性,提高开发效率。

    HQL学习大全.rar

    3. **HQL进阶.docx**:这份文档可能涉及更高级的主题,如联接查询、子查询、集合操作、函数应用等,适合已经掌握HQL基础的读者深入学习。 4. **HQL的多表查询.docx**:这部分内容会详细解释如何在HQL中处理多表之间...

    使用Hibernate开发租房系统

    HibernaCte关联映射,HQL实用技术,HQL进阶,Criteria查询

    超级详细的hql查询语句教程

    #### 三、HQL进阶 ##### 3.1 查询类及其所有继承的类的实例 HQL支持多态性,因此可以查询基类及其派生类的对象: ```hql SELECT s FROM Student s WHERE s INSTANCE OF GraduateStudent ``` 此查询将返回所有`...

    hibernate 中HQL语句查询学习笔记

    #### HQL进阶 ##### 查询类及其所有继承的类的实例 当需要查询某个类及其子类的实例时: ```hql SELECT e FROM Employee e WHERE e.class = Student; ``` 假设`Employee`是父类,而`Student`是其子类。 ##### ...

    Hibernate HQL教程

    #### 1.2 HQL进阶 ##### 1.2.1 查询类及其所有继承的类的实例 - **语法**: ```hql SELECT s FROM Student s WHERE s INSTANCE OF GraduateStudent; ``` - **解释**: 查询`Student`类及其子类`GraduateStudent`的...

    hibernate的HQL的模糊查询

    三、HQL模糊查询的进阶使用 1. **使用`in`关键字**:如果需要查询符合多个条件的记录,可以结合`in`关键字。例如,查询所有名字以"张"或"李"开头的用户: ```java String[] names = {"%张%", "%李%"}; query....

    hibernateHQL基本查询

    #### 五、进阶技巧 - **分页查询**:可以使用 `setFirstResult` 和 `setMaxResults` 方法实现分页查询。 - **排序**:通过添加 `order by` 子句来指定排序规则。 - **连接查询**:可以使用 `join` 关键字进行连接...

    Hibernate HQL查询.docx

    #### 五、进阶查询 除了基本的查询之外,HQL 还支持更复杂的查询,例如连接查询、子查询以及分页查询等。 1. **连接查询** - 使用 `JOIN` 关键字进行连接查询。 - 示例:查询所有用户的订单信息。 ```java ...

    HQL(Hibernate Query Language):

    Hibernate Query Language(HQL)是Hibernate框架中...通过文档《HQL语法入门学习.doc》和《HQL语句大全.txt》,可以系统地了解和掌握HQL的各种用法,而《HQL》可能是实际的代码示例或进阶话题,进一步巩固理论知识。

    hibernate所用到HQL经典语句大全

    ### HQL经典语句大全详解 #### 一、HQL简介及基本语法 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者使用类...掌握这些基础和进阶的知识点对于高效地使用Hibernate进行数据操作至关重要。

    Java进阶诀窍

    12. **JPA与Hibernate**:了解ORM(对象关系映射)技术,掌握JPA规范以及其实现之一Hibernate的使用,包括CRUD操作、查询语言HQL和 Criteria API。 13. **性能优化**:学会分析和优化Java程序性能,使用JProfiler或...

    Hibernate 进阶教程

    《Hibernate 进阶教程》是一本专为对Hibernate有初步了解并希望深入学习的开发者准备的手册。Hibernate作为Java领域中最流行的持久化框架之一,它极大地简化了数据库操作,使得开发者能够更专注于业务逻辑,而非繁琐...

    8.Hadoop入门进阶课程_第8周_Hive介绍和安装部署.pdf

    根据提供的文件信息,以下是有关Hadoop入门进阶课程中Hive介绍和安装部署的知识点: 1. Hive介绍: - Hive是Facebook开发的数据仓库工具,运行于Hadoop集群之上。 - 提供类SQL的HQL(Hive Query Language)查询...

    基于Spring与Hibernate的数据库操作进阶

    本主题“基于Spring与Hibernate的数据库操作进阶”将深入探讨如何利用这两个框架进行高级的数据库交互。 首先,Spring是一个开源的Java平台,它简化了应用程序的开发,并提供了全面的框架支持,包括依赖注入(DI)...

    hiberanate进阶之路jar

    《Hibernate进阶之路:深入解析相关jar包》 在Java世界中,Hibernate作为一个优秀的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨与Hibernate进阶之路相关的jar包,帮助开发者理解这些核心组件...

    spring+struts2+hibernate完整项目初学者进阶练习

    Hibernate则会让学习者理解如何通过实体类和映射文件进行数据库操作,以及事务管理和HQL查询语言的应用。 在实践中,这个项目可能会包含用户登录、注册、客户信息管理、订单处理等功能,这些都是Web应用开发中的...

    《JavaEE框架技术进阶式教程》教学资料.rar

    以下是针对《JavaEE框架技术进阶式教程》教学资料的详细知识点介绍: 1. **Servlet与JSP** - Servlet是JavaEE中的核心组件,用于处理HTTP请求。学习Servlet的生命周期、部署描述符以及如何通过HttpServlet进行响应...

    Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍.doc

    本篇文章主要关注Spring Data JPA在项目中的核心场景与进阶用法,旨在帮助开发者更高效地利用这个框架。 首先,Repository 是Spring Data JPA的核心组件,它为数据访问提供了一种声明式的方法。Repository接口层级...

Global site tag (gtag.js) - Google Analytics