`

hibernate--HQL查询语句(一)

    博客分类:
  • JAVA
阅读更多
本章介绍了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岁。

20

21

22

23

24
分享到:
评论

相关推荐

    hibernate-HQL语句大全

    hibernate-HQL语句大全

    Hibernate-HQL-查询-Query资料

    - "HQL语句(结合实例).doc"则可能提供了具体的查询示例,帮助读者更好地理解和应用HQL。 通过学习这些文档,开发者可以掌握如何在Hibernate项目中高效地利用HQL进行数据查询,提升开发效率,同时保持代码的简洁...

    Hibernate-HQL语句多对多写法

    "Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...

    hibernate-core-5.0.11.Final.jar

    Hibernate Core是Hibernate框架的基础部分,它包含了ORM的核心功能,如实体管理、事务处理、查询语言(HQL)等。`5.0.11.Final`版本是一个稳定且广泛使用的版本,提供了诸多改进和优化。 二、源码结构解析 `...

    hibernate查询语句--HQL

    ### Hibernate 查询语句 -- HQL #### 概述 Hibernate 是一个开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而简化了数据访问逻辑。在 Hibernate 中,执行查询操作的主要...

    Hibernate-HQL.rar_HQL_hibernate hql

    例如,查询所有User对象的HQL语句为:“FROM User”。 二、HQL基本结构 1. SELECT子句:HQL支持多种选择项,包括属性、方法、计算表达式等,如“SELECT u.name FROM User u”。 2. FROM子句:指定查询的实体类,如...

    hibernate-5.2.15. 最新jar包

    3. **Query和Criteria API**:提供两种方式执行查询,一是HQL(Hibernate Query Language),类似于SQL但面向对象;二是Criteria API,提供了一种类型安全的、更具面向对象特性的查询方式。 4. **第二级缓存**:...

    hibernate-release-5.0.0.Final(1).zip

    3. Query:提供HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)来执行数据库查询,也可以通过Criteria API构建动态查询。 4. Transaction:Hibernate支持事务管理,确保数据的一致性和...

    hibernate-release-5.3.2.Final

    2. Criteria API:提供了一种比HQL更面向对象的查询方式,可以动态构建查询条件,避免硬编码SQL语句。 3. CriteriaBuilder:用于构建Criteria查询,提供了强大的查询构建工具,支持复杂的查询逻辑。 4. Query和Named...

    hibernate-orm-master.zip

    4. **查询语言**:Hibernate Query Language (HQL) 是一种面向对象的查询语言,类似于SQL,但操作的是对象和属性。此外,Criteria API提供了一种更面向对象的方式来构建查询,避免硬编码SQL,增强代码的可读性。 5....

    hibernate-release-4.2.4.Final.zip

    8. **HQL(Hibernate Query Language)**: Hibernate 提供了自己的查询语言HQL,它是面向对象的,与SQL类似但更接近Java,可以方便地进行对象级别的查询,避免直接写SQL带来的麻烦。 9. **事务管理**:Hibernate...

    Hibernate HQL查询语句总结.docx

    Hibernate HQL 查询语句是 Hibernate 框架中的一种查询语言,它提供了更加丰富的和灵活的查询特性,具有类似标准 SQL 语句的查询方式,同时也提供了更加面向对象的封装。以下是 Hibernate HQL 查询语句的知识点总结...

    hibernate-distribution-3.6.0

    HQL使得开发者可以脱离具体的数据库方言,写出可移植性强的查询语句。 4. ** Criteria API**:为那些不喜欢HQL或者需要更动态查询的开发者提供了另一种选择。Criteria API允许在运行时构建查询,提供了一种更加面向...

    hibernate-annotations-3.4.0.GA and hibernate-entitymanager-3.4.0.GA

    - HQL(Hibernate Query Language):类似于SQL,专门用于查询Hibernate实体的语句。 - QBC(Query By Criteria):基于Java对象的查询方式,提供构建查询条件的API。 通过以上讲解,我们可以看出`hibernate-...

    hibernate查询语言--HQL

    Hibernate 查询语言 HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它是对SQL的封装,使得开发者可以使用面向对象的方式来处理数据库查询,避免了直接操作SQL带来的复杂性和对象与...

    hibernate-HQL用例

    HQL语句中的实体类名对应于数据库中的表名,属性对应于列名。这使得代码更加面向对象,易于维护。 2. **基本查询结构** HQL的基本查询结构包括:SELECT,FROM,WHERE,GROUP BY,HAVING,ORDER BY等关键字。例如,...

    经典hibernate教程-HQL语句

    HQL的全称是?...HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用'?'做占位符的参数查询,怎样设置参数的值? 命名参数查询的语法是? 怎样创建Criteria查询对象?

    hibernate-3.3.2.GA-jar包集合

    - Hibernate提供了一种强大且灵活的Criteria API,允许开发者基于对象的查询,无需写SQL。 8. **HQL(Hibernate Query Language)**: - Hibernate特有的面向对象的查询语言,类似于SQL,但更加面向对象。 9. **...

    hibernate-release-4.2.12.Final libs

    - 查询优化:使用HQL或Criteria API编写查询语句,可避免SQL注入,同时支持复杂的关联查询。 - 缓存机制:通过集成Ehcache等缓存库,提高数据访问效率,减少数据库负载。 - 事务管理:Hibernate支持JTA和JDBC事务...

Global site tag (gtag.js) - Google Analytics