ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:22.81KB ,
资源ID:4926378      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4926378.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Hibernate的HQL查询.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Hibernate的HQL查询.docx

1、Hibernate的HQL查询4.3 使用HQL查询Hibernate提供了异常强大的查询体系,使用Hibernate有多种查询方式。可以选择使用Hibernate的HQL查询,或者使用条件查询,甚至可以使用原生的SQL查询语句,此外还提供了一种数据过滤功能,这些都可用于筛选目标数据。下面分别介绍Hibernate的4种数据筛选方法:4.3.1 HQL查询HQL是Hibernate Query Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。HQL是完全面向对象的查询语言

2、,因此可以支持继承和多态等特征。HQL查询依赖于Query类,每个Query实例对应一个查询对象。使用HQL查询可按如下步骤进行:(1)获取Hibernate Session对象;(2)编写HQL语句;(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;(5)调用Query对象的list等方法遍历查询结果。看下面的查询示例:public class HqlQuery public static void main(String args)throws Exception HqlQuer

3、y mgr = new HqlQuery(); /调用查询方法 mgr.findPersons(); /调用第二个查询方法 mgr.findPersonsByHappenDate(); HibernateUtil.sessionFactory.close(); /第一个查询方法 private void findPersons() /获得Hibernate Session Session sess = HibernateUtil.currentSession(); /开始事务 Transaction tx = sess.beginTransaction(); /以HQL语句创建Query对象.

4、 /执行setString方法为HQL语句的参数赋值 /Query调用list方法访问查询的全部实例 List pl = sess.createQuery(from Person p where p.myEvents.title = :eventTitle) .setString(eventTitle,很普通事情) .list(); /遍历查询的全部结果 for (Iterator pit = pl.iterator() ; pit.hasNext(); ) Person p = ( Person )pit.next(); System.out.println(p.getName(); /提交

5、事务 mit(); HibernateUtil.closeSession(); /第二个查询方法 private void findPersonsByHappenDate()throws Exception /获得Hibernate Session对象 Session sess = HibernateUtil.currentSession(); Transaction tx = sess.beginTransaction(); /解析出Date对象 SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd); Date start = sdf

6、.parse(2005-01-01); System.out.println(系统开始通过日期查找人 + start); /通过Session的createQuery方法创建Query对象 /设置参数 /返回结果集 List pl = sess.createQuery( from Person p where p.myEvents.happenDate between :firstDate and :endDate) .setDate(firstDate,start) .setDate(endDate,new Date() .list(); /遍历结果集 for (Iterator pit =

7、 pl.iterator() ; pit.hasNext(); ) Person p = ( Person )pit.next(); System.out.println(p.getName(); mit(); HibernateUtil.closeSession(); 通过上面的示例程序,可看出查询步骤基本相似。Query对象可以连续多次设置参数,这得益于Hibernate Query的设计。通常,setXxx方法的返回值都是void,但Hibernate Query的setXxx方法返回值是Query本身。因此,程序通过Session创建Query后,直接多次调用setXxx方法为HQL语

8、句的参数赋值,再直接调用list方法返回查询到的全部结果即可。Query还包含两个方法: setFirstResult(int firstResult),设置返回的结果集从第几条记录开始。 setMaxResults(int maxResults),设置本次查询返回的结果数。这两个方法用于实现Hibernate分页。下面简单介绍HQL语句的语法。HQL语句本身是不区分大小写的。也就是说,HQL语句的关键字和函数都是不区分大小写的。但HQL语句中所使用的包名、类名、实例名和属性名都区分大小写。4.3.2 HQL查询的from子句from子句是最简单的HQL语句,也是最基本的HQL语句。from关

9、键字后紧跟持久化类的类名。例如:from Person表明从Person持久化类中选出全部的实例。大部分时候,推荐为该Person的每个实例起别名。例如:from Person as p在上面的HQL语句中,Person持久化类中的实例的别名为p,既然 p是实例名,因此也应该遵守Java的命名规则:第一个单词的首字母小写,后面每个单词的首字母大写。命名别名时,as关键字是可选的,但为了增加可读性,建议保留。from后还可同时出现多个持久化类,此时将产生一个笛卡儿积或跨表的连接。4.3.3 HQL查询的select子句select子句用于确定选择出的属性,当然select选择的属性必须是from

10、后持久化类包含的属性。例如:select p.name from Person as pselect可以选择任意属性,不仅可以选择持久化类的直接属性,还可以选择组件属性包含的属性,例如:select p.name.firstName from Person as pselect也支持将选择出的属性存入一个List对象中,例如:select new list(p.name , p.address) from Person as p甚至可以将选择出的属性直接封装成对象,例如:select new ClassTest(p.name , p.address) from Person as p前提是Cl

11、assTest支持p.name和p.address的构造器,假如p.name的数据类型是 String,p.address的数据类型是String,则ClassTest必须有如下的构造器:ClassTest(String s1, String s2)select还支持给选中的表达式命名别名,例如:select p.name as personName from Person as p这种用法与new map结合使用更普遍。如:select new map(p.name as personName) from Person as p在这种情形下,选择出的是Map结构,以personName为ke

12、y,实际选出的值作为value。4.3.4 HQL查询的聚集函数HQL也支持在选出的属性上,使用聚集函数。HQL支持的聚集函数与SQL完全相同,有如下5个: avg,计算属性平均值。 count,统计选择对象的数量。 max,统计属性值的最大值 min,统计属性值的最小值。 sum,计算属性值的总和。例如:select count(*) from Personselect max(p.age) from Person as pselect子句还支持字符串连接符、算术运算符以及SQL函数。如:select p.name | | p.address from Person as pselect子句

13、也支持使用distinct和all关键字,此时的效果与SQL中的效果完全相同。4.3.5 多态查询HQL语句被设计成能理解多态查询,from后跟的持久化类名,不仅会查询出该持久化类的全部实例,还会查询出该类的子类的全部实例。如下面的查询语句:from Person as p该查询语句不仅会查询出Person的全部实例,还会查询出Person的子类,如Teacher的全部实例,前提是Person和Teacher完成了正确的继承映射。HQL支持在from子句中指定任何Java类或接口,查询会返回继承了该类的持久化子类的实例或返回实现该接口的持久化类的实例。下面的查询语句返回所有被持久化的对象:fr

14、om java.lang.Object o如果Named接口有多个持久化类,下面的语句将返回这些持久化类的全部实例:from Named as n注意:后面的两个查询将需要多个SQL SELECT语句,因此无法使用order by子句对结果集进行排序,从而,不允许对这些查询结果使用Query.scroll()方法。4.3.6 HQL查询的where子句where子句用于筛选选中的结果,缩小选择的范围。如果没有为持久化实例命名别名,可以直接使用属性名引用属性。如下面的HQL语句:from Person where name like tom%上面HQL语句与下面的语句效果相同:from Pers

15、on as p where p.name like tom%在后面的HQL语句中,如果为持久化实例命名了别名,则应该使用完整的属性名。两个HQL语句都可返回name属性以tom开头的实例。复合属性表达式加强了where子句的功能,例如如下HQL语句:from Cat cat where cat.mate.name like kit%该查询将被翻译成为一个含有内连接的SQL查询,翻译后的SQL语句如下:select*from cat_table as table1 cat_table as table2 where table1.mate =table2.id and table1.name l

16、ike kit%再看下面的HQL查询语句:from Foo foo where foo.bar.baz.customer.address.city likeguangzhou%翻译成SQL查询语句,将变成一个四表连接的查询。=运算符不仅可以被用来比较属性的值,也可以用来比较实例:from Cat cat, Cat rival where cat.mate = rival.mateselect cat, matefrom Cat cat, Cat matewhere cat.mate = mate特殊属性(小写)id可以用来表示一个对象的标识符。(也可以使用该对象的属性名。)from Cat a

17、s cat where cat.id = 123from Cat as cat where cat.mate.id = 69第二个查询是一个内连接查询,但在HQL查询语句下,无须体会多表连接,而完全使用面向对象方式的查询。id也可代表引用标识符。例如,Person类有一个引用标识符,它由country属性 与medicareNumber两个属性组成。下面的HQL语句有效:from Person as personwhere person.id.country = AU and person.id.medicareNumber = 123456from Account as accountwhe

18、re account.owner.id.country = AU and account.owner.id.medicareNumber = 123456第二个查询跨越两个表Person和Account。是一个多表连接查询,但此处感受不到多表连接查询的效果。在进行多态持久化的情况下,class关键字用来存取一个实例的鉴别值(discriminator value)。嵌入where子句中的Java类名,将被作为该类的鉴别值。例如:from Cat cat where cat.class = DomesticCatwhere子句中的属性表达式必须以基本类型或java.lang.String结尾,不

19、要使用组件类型属性结尾,例如Account有Person属性,而Person有Name属性,Name有firstName属性。看下面的情形:from Account as a where a.person.name.firstName like dd% /正确from Account as a where a.person.name like dd% /错误4.3.7 表达式HQL的功能非常丰富,where子句后支持的运算符异常丰富,不仅包括SQL的运算符,还包括EJB-QL的运算符等。where子句中允许使用大部分SQL支持的表达式: 数学运算符+、*、/等。 二进制比较运算符=、=、=、!

20、=、like等。 逻辑运算符and、or、not等。 in、not in、between、is null、is not null、is empty、is not empty、member of和not member of等。 简单的case、case . when . then . else . end和case、case when . then . else . end等。 字符串连接符value1 | value2或使用字符串连接函数concat(value1 , value2)。 时间操作函数current_date()、current_time()、current_timestamp(

21、)、second()、minute()、hour()、day()、month()、year()等。 HQL还支持EJB-QL 3.0所支持的函数或操作substring()、trim()、lower()、upper()、length()、locate()、abs()、sqrt()、bit_length()、coalesce()和nullif()等。 还支持数据库的类型转换函数,如cast(. as .),第二个参数是Hibernate的类型名,或者extract(. from .),前提是底层数据库支持ANSI cast()和extract()。 如果底层数据库支持如下单行函数sign()、t

22、runc()、rtrim()、sin()。则HQL语句也完全可以支持。 HQL语句支持使用?作为参数占位符,这与JDBC的参数占位符一致,也可使用命名参数占位符号,方法是在参数名前加冒号 :,例如 :start_date和:x1等。 当然,也可在where子句中使用SQL常量,例如foo、69、1970-01-01 10:00: 01.0等。 还可以在HQL语句中使用Java public static final 类型的常量,例如eg.Color.TABBY。除此之外,where子句还支持如下的特殊关键字用法。 in与between.and可按如下方法使用:from DomesticCat

23、cat where cat.name between A and Bfrom DomesticCat cat where cat.name in ( Foo,Bar,Baz) 当然,也支持not in和not between.and的使用,例如:from DomesticCat cat where cat.name not between A and Bfrom DomesticCat cat where cat.name not in ( Foo,Bar,Baz ) 子句is null与is not null可以被用来测试空值,例如:from DomesticCat cat where ca

24、t.name is null;from Person as p where p.address is not null;如果在Hibernate配置文件中进行如下声明:true 1, false 0上面的声明表明,HQL转换SQL语句时,将使用字符1和0来取代关键字true和false。然后将可以在表达式中使用布尔表达式,例如:from Cat cat where cat.alive = true size关键字用于返回一个集合的大小,例如:from Cat cat where cat.kittens.size 0from Cat cat where size(cat.kittens) 0 对

25、于有序集合,还可使用minindex与maxindex函数代表最小与最大的索引序数。同理,可以使用minelement与maxelement函数代表集合中最小与最大的元素。 例如:from Calendar cal where maxelement(cal.holidays) current datefrom Order order where maxindex(order.items) 100from Order order where minelement(order.items) 10000 可以使用SQL函数any、some、all、exists、in操作集合里的元素,例如:/操作集合

26、元素select mother from Cat as mother, Cat as kitwhere kit in elements(foo.kittens)/p的name属性等于集合中某个元素的name属性select p from NameList list, Person pwhere p.name = some elements(list.names)/操作集合元素from Cat cat where exists elements(cat.kittens)from Player p where 3 all elements(p.scores)from Show show where

27、 fizard in indices(show.acts)注意这些结构变量size、elements、indices、minindex、maxindex、minelement、maxelement 等,只能在where子句中使用。 where子句中,有序集合的元素(arrays, lists, maps)可以通过 运算符访问。例如:/items是有序集合属性,items0代表第一个元素from Order order where order.items0.id = 1234/holidays是map集合属性,holidaysnational day代表其中一个元素select person f

28、rom Person person, Calendar calendarwhere calendar.holidaysnational day = person.birthDayand person.nationality.calendar = calendar/下面同时使用list 集合和map集合属性select item from Item item, Order orderwhere order.items order.deliveredItemIndices0 = item and order.id = 11select item from Item item, Order orderwhere order.items maxindex(order.items) = item and order.id = 11在中的表达式甚至可以是一个算术表达式,例如:select item from Item item, Order orderwhere order.items size(order.items) - 1 = item借助于HQL,可以大大简化选择语句的书写,提高查询语句的可读性,看下面的HQL语句:select custf

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1