`
hugang357
  • 浏览: 182481 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate Query Language(HQL)

    博客分类:
  • ssh
阅读更多
    Hibernate Query Language(HQL)提供了十分强大的功能,推荐大家使用这种查询方式。HQL具有与SQL语言类似的语法规范,只不过SQL针对表中字段进行查询,而HQL针对持久化对象,它用来取得对象,而不进行update、delete和insert等操作。而且HQL是完全面向对象的,具备继承、多态和关联等特性。

1.from子句

from字句是最简单的HQL语句,例如 from Student,也可以写成select s from Student s。它简单地返回Student类的所有实例。


除了Java类和属性的名称外,HQL语句对大小写并不敏感,所以在上一句HQL语句中,from与FROM是相同的,但是Student 与student就不同了,所以上述语句写成from student就会报错。下列程序演示如何通过执行from语句取得所有的Student对象。

Query query = session.createQuery(“from Student”);
List list = query.list();
for (int i=0;i<list.size(); i++)
{
Student stu = (Student)list.get(i);
System.out.println(stu.getName());
}

如果执行HQL语句“from Student, Course”,并不简单地返回两个对象,而是返回这两个对象的的笛卡儿积,这类似于SQL语句中字段的全外连接。在实际应用中,像“from Student, Course”这样的语句几乎不会出现。

2.select子句

有时并不需要得到对象的所有属性,这时可以使用select子句进行属性查询,例如,select s.name from Student s。下面程序演示如何执行这个语句:

Query query = session.createQuery(“select s.name from Student s”);
List list = query.list();
for (int i=0;i<list.size(); i++) {
String name = (String)list.get(i);
System.out.println(ame());
}

如果要查询两个以上的属性,查询结果会以数组的方式返回,如下所示:

Query query = session.createQuery(“select s.name, s.sex from Student as s”);
List list = query.list();
for (int i=0;i<list.size(); i++) {
Object obj[] = (Object[])list.get(i);
System.out.println(ame(obj[0] + “的性别是:” +obj[1]));
}

在使用属性查询时,由于使用对象数组,操作和理解都不太方便,如果将一个object[]中所有成员封装成一个对象就方便多了。下面的程序将查询结果进行了实例化:

Query query = session.createQuery(“select new Student(s.name, s.sex) from Student s”);
List list = query.list();
for (int i=0;i<list.size(); i++) {
Student stu = (Student)list.get(i);
System.out.println(stu.getName());
}

要正确运行以上程序,还需要在Student类中加入一个如下的构造函数:

public Student(String name, String sex)
{
this.name = name;
this.sex = sex;
}

3.统计函数查询

可以在HQL中使用函数,经常使用的函数有:


count():统计记录条数
min():求最小值
max():求最大值
sum():求和
age():求平均值

例如,要取得Student实例的数量,可以编写如下HQL语句:

select count(*) from Student

取得Student的平均年龄的HQL语句如下:

select avg(s.age) from Student as s

可以使用distinct去除重复数据:

select distinct s.age from Student as s

4.where子句

HQL也支持子查询,它通过where子句实现这一机制。where子句让用户缩小要返回的实例的列表范围,例如下面语句会返回所有名字为“Bill”的Student实例:

Query query = session.createQuery("from Student as s where s.name='Bill' ");

where子句允许出现的表达式包括了SQL中可以使用的大多数情况:
数学操作:+,-,*,/
真假比较操作:=,>=,<=,<>,!=,like
逻辑操作:and,or, not
字符串连接:||
SQL标量函数:例如upper()和lower()

如果子查询返回多条记录,可以用以下的关键字来量化:

all:表示所有的记录。
any:表示所有记录中的任意一条。
some:与any用法相同。
in:与any等价。
exists:表示子查询至少要返回一条记录。

例如,下面语句返回所有学生的年龄都大于22的班级对象:

from Group g where 22<all (select s.age from g.students s)

下述语句返回在所有学生中有一个学生的年龄等于22的班级:

from Group g where 22=any (select s.age from g.students s)

或者

from Group g where 22=some (select s.age from g.students s)

或者

from Group g where 22 in (select s.age from g.students s)

5.order by 子句

查询返回的列表可以按照任何返回的类或者组件的属性排序:

from Student s order by s.name asc

asc和desc是可选的,分别代表升序或者降序。

6.连接查询

与SQL查询一样, HQL也支持连接查询,如内连接、外连接和交叉连接。

inner join: 内连接
left outer join:左外连接
right outer join:右外连接
full join: 全连接,但不常用

下面重点讲解内连接查询,左外连接和右外连接查询和内连接大同小异,而全连接几乎不怎么使用。

inner join可以简写为join,例如在查询得到Group对象时,内连接取得对应的Student对象,实现的程序如下。

……//打开Session,开启事务
Student  stu = null;  //声明Student实例
Group  group = null; //声明Group实例
Query query = session.createQuery("from Group g join g.students");
List list = query.list();
Object obj[] = null;  //声明对象数组

for(int i=0;i<list.size();i++)  {
obj = (Object[])list.get(i); //取得集合中的第i个数组
group = (Group)obj[0];  //group是数组中第一个对象
stu = (Student)obj[1];   //stu是数组中第二个对象
System.out.println(stu.getName() + "属于:" +group.getName() );
}
……//提交事务,关闭Session
分享到:
评论

相关推荐

    HQL(Hibernate Query Language):

    HQL(Hibernate Query Language):是面向对象的查询语句,它的语法和SQL语句有些相像,在运行时才得以解析.HQL并不像SQL那样是.

    Hibernate Query Language

    Hibernate Query Language 培训教材

    Hibernate Query Language基础使用详解

    讲解如何使用HQL,包括基本的操作和进阶用的高级使用

    Hibernate Tutorial 09 Hibernate Query Language

    HQL is database independent and translated into SQL by Hibernate at runtime. When writing HQL, we can concentrate on the objects and properties without knowing much detail on the underlying database. ...

    hibernate中的hql查询案例

    HQL(Hibernate Query Language),提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。查询的表(Table)名称是类的名称,表的字段是对象的属性,有多个类的话,可以使用类的全限定名来指定,比如...

    Hibernate_Query_Language基础认识.rar

    Hibernate_Query_Language基础认识,主要是使用了一些HQL的特性,用idea搭建,适合小白上手

    JDBC与Hibernate区别

    ◆使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言 ◆操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,...

    MyEclipse中hibernate的配置

    和JDBC比较一下,同样都是数据库中间件(DM,Database Middleware),JDBC利用SQL语言操作的是数据,而Hibernate则是利用自己的查询语言Hibernate Query Language(HQL虽然底层还是要转换成sql语言)操作的是持久化对象...

    Hibernate Recipes A Problem-Solution Approach

    How to use Hibernate Query Language (HQL) How to perform batch processing and use native SQL, criteria queries, caching objects, and more How to enable Hibernate in web applications with e-commerce ...

    基于Maven构建的Spring+Hibernate+Struts2 web项目(免费提供全部源码)

    Hibernate的HQL(Hibernate Query Language)提供了强大的查询功能,支持复杂的数据检索和操作。 Struts2框架:作为MVC框架,Struts2负责处理用户请求和响应。它的Action机制和拦截器(Interceptor)体系使得请求...

    关于hibernate 的createQuery和createSqlQuery 的区别

    createQuery 方法是 Hibernate 提供的一种查询机制,用于执行 HQL(Hibernate Query Language)语句。HQL 语句是一种面向对象的查询语言,类似于 SQL 语句,但是它是基于对象的,而不是基于表的。createQuery 方法...

    Hibernate中Criteria的用法

    Criteria 查询机制主要包括 QBE(Query By Example)、QBC(Query By Criteria)和 HQL(Hibernate Query Language)三种方式。 QBE(Query By Example) QBE 是一种基于示例的查询机制,它可以根据一个示例对象来...

    hibernate操作数据库笔记

    一.使用Hibernate的Session对象操作数据库 1.初始化Hibernate:在要使用Hibernate的类的方法中实例化Configuration对象并用Configuration对象的configure()方法将hibernate... //HQL(Hibernate Query Language)语句查询

    hibernate.properties

    #hibernate.query.factory_class org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory ################# ### Platforms ### ################# ## JNDI Datasource #hibernate.connection....

    HQL查询语言的使用介绍

    HQL是Hibernate Query Language的缩写,语法很想SQL,但是HQL是一种面向对象的查询语言。SQL的操作对象是数据列、表等数据库对象,而HQL操作的是类、实例、属性

    hibernate 教程

    Hibernate查询语言(Query Language), 即HQL 11.1. 大小写敏感性(Case Sensitivity) 11.2. from 子句 11.3. 联合(Associations)和连接(joins) 11.4. select子句 11.5. 统计函数(Aggregate ...

    Hibernate Reference Documentation3.1

    14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Associations and joins 14.4. Forms of join syntax 14.5. The select clause 14.6. Aggregate functions 14.7. ...

    hibernate总结

    2. 通过HQL/SQL 检索 hibernate query language (面向对象的查询语言) * a) 不再操纵表,它操纵的是持久化类的对象 b) 面向对象的 3. QBC ( query by criteria ) 更加面向对象 4. QBE ( query by Example ) 5....

    hibernate

    Hibernate查询语言(Query Language), 即HQL 11.1. 大小写敏感性(Case Sensitivity) 11.2. from 子句 11.3. 联合(Associations)和连接(joins) 11.4. select子句 11.5. 统计函数(Aggregate ...

    Hibernate开发指南

    Hibernate Query Language (HQL).........................................36 数据关联 ........................................................................................................37 一对一...

Global site tag (gtag.js) - Google Analytics