hql语句Word文档下载推荐.docx
- 文档编号:15947395
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:13
- 大小:25.23KB
hql语句Word文档下载推荐.docx
《hql语句Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《hql语句Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
虽然HQL的语法类似于SQL,但实际上它的查询目标是对象。
HQL拥有面向对象语言的所有的特性,这其中包括多态、继承和组合。
这就相当于一个面向对象的SQL,为了提供更强大的功能,HQL还提供了很多的查询函数。
这些函数可以被分为四类:
1.投影函数
2.约束函数
3.聚合函数
4.分组函数
使用HQL可以建立简单的查询,也可以建立更复杂的查询。
在本文中并不讨论那些非常复杂的查询,如含有子查询和很多连接的查询。
本文只讨论连接两个表的查询。
现在让我们开始接近HQL吧!
投影
如谓投影,就是一个可以访问的对象或对象的属性。
在HQL中,可以使用from和select子句来完成这个工作。
from子句返回指定的类的所有实例。
如fromOrder将返回Order类的所有实例。
换句话说,以上的查询相当于以下的SQL语句:
select*fromorder
from是最简单的查询子句。
from后面可以跟一个或多个类名(类名也可以带有别名)。
为了得到Order和Product的所有实例,可以使用如下的查询:
fromOrder,Product
和类名一样,别名也可以在from后使用,如下代码如示:
fromOrderaso,Productp
当查询很复杂时,加入别名可以减少语句的长度。
我们可以看看如下的SQL语句:
selecto.*,p.*fromordero,productpwhereo.order_id=p.order_id
我们可以很容易看出,上面的查询是一对多的关系。
在HQL中相当于一个类中包含多个其它类的实例。
因此,以上的SQL写成HQL就是:
fromOrderasoinnerjoino.productsasproduct
现在让我们考虑另外一个从表中得到指定属性的情况。
这就是最常用的select子句。
这在HQL中的工作方式和SQL中一样。
而在HQL中,如果只是想得到类的属性的话,select语句是最后的选择。
以上的SQL可以使用select子句改成如下的HQL语句:
selectproductfromOrderasoinnerjoino.productsasproduct
以上的HQL语句将返回Order中的所有Products实例。
如果要得到对象的某一个属性,可以将HQL语句写成如下的形式:
selectproduct.namefromOrderasoinnerjoino.productsasproduct
如果要得到多个对象的属性,可以将HQL语句写成如下形式:
selecto.id,product.namefromOrderasoinnerjoino.productsasproduct
接下来,我们将进入下一个议题。
假设我们需要根据某些条件得到数据。
那么以上所述的HQL语句将无法满足需求。
为了达到这一目的,我们就要用到下面将要讨论的约束子句。
#p#
约束
从以上可知,投影返回的是所有的数据。
但在大多数时候我们并不需要这么多数据。
这就需要对数据进行过滤。
在HQL中过滤数据的子句和SQL一样,也是where。
它的语法类似于SQL,通过where子句,可以对行进行过滤。
我们可以看看下面的SQL语句:
select*fromorderswhereid=‘1234’
这条查询语句返回了id等于1234的所有的字段。
和这条SQL对等的是下面的HQL语句:
selectofromOrderowhereo.id=’1234’
从以上两条语句可以看出,它们的where子句非常相似。
而它们唯一的不同是SQL操作的是记录,而HQL操作的是对象。
在HQL中,除了where子句可以过滤数据外,having子句也可以做到这一点(关于having子句的详细内容我将在分组部分讨论)。
投影和约束是两个基本的操作,这两个操作再加上聚合函数的话,那HQL将变得更加强大。
下面我们就来讨论什么是聚合。
聚合
上述的查询都是将每一个记录(对象)当做一个单位,而如果使用聚合,可以将一类记录(对象)当做一个单位。
然后再对每一类的记录(对象)进行一系列地操作,如对某一列取平均值、求和、统计行数等等。
HQL支持以下的聚合函数:
1.avg(…),sum(…)
2.min(…),max(…)
3.count(*),count(…),count(distinct…),count(all…)
以上的聚合函数都返回数值类型。
这些操作都可以在select子句中使用,如下所示:
selectmax(o.priceTotal)+max(p.price)fromOrderojoino.productspgroupbyo.id
以上的HQL语句返回了两个值的和:
orders表中的priceTotal的最大值和products表中的price的最大值之和。
我们还可以使用having子句对分组进行过滤。
如我们想按id统计priceTotal小于1000的数量可按如下的HQL语句去实现:
selectcount(o)fromOrderohavingo.priceTotal<
1000groupbyo.id
我们还可以将聚合函数和having子句一起使用。
如我们要按products表的id统计price小于amount的平均数的产品数量,HQL语句如下:
selectcount(p)fromProductphavingp.price<
avg(amount)groupbyp.id
从上面的一系列的HQL语句可以看出,所有通过SQL实现的,都可以通过HQL来实现。
分组
在上一部分,已经涉及到了分组的概念。
分组操作的是行的集合。
它根据某一列(属性)对记录集进行分组。
这一切是通过group子句实现的。
如下的例子描述了group子句的一般用法。
selectcount(o)fromOrderohavingo.priceTotal>
=1200ando.priceTotal<
=3200
groupbyo.id
HQL中的分组和SQL中的分组类似。
总之,除了一些对SQL的特殊扩展外,其它所有的SQL功能都可以使用HQL描述。
在接下来的部分,让我们举例说明如何在Java中使用HQL。
在Java中使用HQL到现在为止,我们已经学习了HQL的基本用法。
接下来我们举一个例子来说明如何在Java中使用HQL。
下面的例子只给出了主要的部分,由于本文只是讨论HQL的用法,因此,关于Hibernate的一些设置和在main()函数中调用Hibernate的部分并未给出,读者可以参考相关的文当。
现在让我们看看下面的例子。
下面是必须引用的包
importjava.util.List;
importorg.hibernate.*;
importorg.hibernate.cfg.*
importcom.Order;
下面是类的声明
publicclassMyOrder
{
……
}
下面让我们来实现MyOrder类的构造函数
publicclassMyOrder
SessionFactorysf;
publicMyOrder()
Configurationcfg=newConfiguration().addClass(Order.class);
sf=cfg.buildSessionFactory();
}
下面的getOrder函数根据priceTotal的区间值返回Order对象。
….….
publicOrdergetOrder(Stringlower,Stringupper)
//打开一个会话
Sessionsess=sf.openSession();
//HQL语句
Stringquery="
selectofromo"
+"
Orderasojoino.productsasp"
whereo.priceTotal>
:
priceTotalLower"
ando.priceTotal<
priceTotalUpper"
;
Queryq=sess.createQuery(query);
//将两个参数传入HQL中
q.setDouble("
Double.parseDouble(lower));
Double.parseDouble(upper));
Listlist=q.list();
Ordero=(Order)list.iterator.next();
returno;
下面的main函数将测试MyOrder类
publicstaticvoidmain(Stringargs[])
Ordero=MyOrder().getOrder(“100”,“300”);
System.out.println(“id=”+o.id);
小结
上述的代码演示了如何在Java中使用HQL,但HQL还有两点需要注意一下:
1.HQL并不区分字母的大小写,但在HQL中的Java类和属性名必须和实际的类和属性名一致。
如SELECT和select之间可以互换,但Order和order却代表不同的含义。
2.如果HQL中引用的类未被导入,在HQL中必须引用具体的包。
如本例中,如果com.Order未被导入,在HQL中必须将Order写成com.Order。
(责任编辑火凤凰sunsj@
TEL:
(010)68476636-8007)
编辑本段HQL查询
Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(HibernateQueryLanguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。
完整的HQL语句形式如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hql 语句