hibernate查询之HQL分析和总结.docx

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

上次我们一起学习了用Criteria进行相关的操作,但由于Criteria并不是Hibernate官方推荐的查询方式,我们也并不多用。现在我们来看一下官方推荐的HQL,一起学习一下它的强大。

说是HQL,也就是Hibernate查询语句,和SQL有什么区别呢?一个字母的区别,哈哈。

当然不是这样,HQL和SQL的区别在于思想的不同,HQL是用面向对象的方向进行查询,而SQL则是对数据库二维表进行查询,这里包含的是思想的不同。HQL实际上也是SQL,它由Hibernate帮我们在内部进行转换,生成SQL。

Java代码废话不多说,我们直接看一下它的强大。

Java代码

1.fromUser

这个代码很熟悉吧,因为我们在SQL中经常也用到from表名,但这里有点不同的是User在这里并不是表名,而是实体类的名称,由hibernate帮我们进行映射。

Java代码联想SQL语句,如果我们想查出某个属性,并且根据某个属性进行条件限制,很简单可以得到类似语句:

Java代码

1.selectusr.name,usr.agefromUserwhereusr.age20andusr.age60

这样我们就查出了年龄大于20且小于60的User的姓名和年龄。很容易理解。

SQL语句中的and,or,like,,,=等都可以在HQL中进行使用。

需要注意的是当我们查询多个属性时,返回的结果是一个Object[]数组,而只有单个时是返回Object,这个需要不同的解析方式,所以在查询时需要注意。

Java代码当然,我们前面说了HQL是面向对象的,而我们这样做,就不是面向对象的思想了。我们来改一下:

Java代码

1.selectnewUser(usr.name,usr.age)fromUserusrwhereusr.age20

Java代码这样我们就把查询到的结果放到了User对象中,注意,这里调用的是User的构造函数,User类中必须存在接收两个参数的User构造函数,否则会报错,错误信息大概如下:

Java代码

1.Unabletolocateappropriateconstructoronclass[org.hibernate.tutorial.domain8.User]

它找不到合适的构造函数。很明白,加上接收对应参数的构造函数就可以了。注意,上面当我们进行查出的时候并没有查出相应的ID,如果此时我们调用

saveOrUpdate方法时,它实际上执行的是保存的操作。

我们看一下测试代码:

Java代码我在执行完上面的查询语句后,进行下面的操作:

Java代码

while(iter.hasNext()){

Useruser=(User)iter.next();

user.setName(sun2);

session.saveOrUpdate(user);5.}

Java代码这时Hibernate的语句为:

Java代码

1.Hibernate:insertintoUSER(USER_NAME,age)values(?,?)

它新插入一条,而不是更新。

Java代码那么如果我们需要它进行更新的时候就需要把ID一起查出:

Java代码

1.selectnewUser(usr.name,usr.age,usr.id)fromUserusrwhereusr.age(selectavg(usr.age)fromusr)

记得修改User构造方法。

Java代码这时我们再执行我们的测试代码,此时会得到:

Java代码

1.Hibernate:updateUSERsetUSER_NAME=?,age=?whereUSER_ID=?

Java代码我们可以在HQL语句中加上SQL函数:

Java代码

1.selectusr.namefromUserusrwhereusr.age(selectavg(usr.age)fromusr)

这段HQL查出年龄大于平均年龄的User的name。

Java代码在Hibernate3中我们可以很方便地更新和删除对象,而不必像2中需要先load然后再delete,我们可以直接一条语句搞定:

Java代码

1.updateUsersetname=123123wherename=sun33

Java代码删除语句类似:

Java代码

1.delete

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档