java hql_《Java从入门到放弃》入门篇:hibernate查询——HQL

本文详细介绍了Hibernate的HQL查询语言,包括查询所有作者、按条件查询博客、分页、排序、子查询等多种操作。通过实例演示了HQL的使用,包括select、from、where、order by等关键字的运用,并展示了使用Object[]、List、Map和自定义实体类接收查询结果的方式。
摘要由CSDN通过智能技术生成

不知不觉又到了hibernate的最后一篇了,只感觉时光飞逝~,岁月如梭~!

转眼之间,我们就···························,好吧,想装个X,结果装不下去了,还是直接开始吧·a1df7fb8e3bdbe6f5e8a1f68eb8d50eb.png

前面我们已经把hibernate中添加、删改、修改和根据ID得到对象的方法都学习了,但如何才能查询出多条记录呢?比如我想查询所有姓黄的作者,查询标题包含“中”字的博客等。这一篇就来介绍查询。

hibernate有两种检索(查询)数据的方式,分别是HQL(Hibernate Query Language)和QBC(Query By Criteria)。官方推荐使用HQL的方式,不要问我为什么,因为············就算你很诚恳的询问我,我也不会告诉你。反正用过HQL的人都说好。bba025caa50b2d0db3aeeefc8857927a.png

HQL提供的语法与SQL非常相似,支持动态参数绑定、投影查询、分页查询、连接查询、分组查询、内置聚集函数、子查询等,可以说是数据库中常用的查询功能,HQL都可以实现。

当然,HQL并不是只能查询,其实也可以用来执行insert、delete和update语句(使用HQL语法),只不过我们今天不讲,大家有兴趣自己练习一下就OK了。

HQL使用步骤:

)获取Session对象

)编写HQL语句

)获得Query对象

)动态绑定参数

)调用执行方法

今天玩点花样,我们通过常用的查询功能来讲解每个语法吧。

一、查询所有的作者

注意:

1. 查询Author的所有属性时可以省略select部分

2. from后面的Author是Java中的实体类的类名,在HQL语句中 select或from之类的关键字不区别大小写,但类名、属性名必须和实体类大小写完全相同。

结果:

c5f2345f85578cd606d0c0793b0c9dc9.png

二、查询作者ID为2的所有博客

注意:

这儿的条件,where后面的author是Blog实体类中的author属性,参数是什么类型就可以使用setxxx传对应的类型

参数有两种写法:一种是使用“?”,相当于占位符,另一种使用“:xxx”,相当于根据名字传值。

结果:

193cea0e768c02df477297547214bf2a.png

三、查询标题包含“中”字的所有博文

注意:

like后面不能写成'%?%',这种写法是错误的。必须在外面拼接好前后的“%”,再作为参数传递给query对象。

结果:

806ce0d774cc7e6dee6e6f4bc14a7de5.png

四、按博文创建日期倒序排列所有博文

注意:

反复看了三遍,发现真的没有哪儿需要注意,我也很绝望啊!a12b1a2f2a773fc7398eeb7bd8a8b11c.png

结果:

08815832dd41552f7470ed3375dd6d6f.png

五、假如每页显示3篇博文,在上一查询的基础上,查询第2页的博文

注意:

setFirstResult表示查询的第一条记录的下标,setMaxResults表示查询几条记录,一般分页都是传递页码(第几页)过来。至于实际项目中的分页如何编写,等后面我们讲常用功能模块时再来说明吧。

结果:

a92bfc919d9373706c773423d4564c87.png

六、根据手机号查询作者(确定最多只有一条记录)

注意:

确定查询结果最多只有一条记录时,可以使用uniqueResult()方法。

结果:

063731c98ece9f7b45f27dd3df6ec6e1.png

单表查询并且返回所有属性的查询语法,到这儿就告一段落。

接下来进行部分属性的查询、分组查询、多表查询和子查询。

查询语法加上select子句后,返回的结果有以下几种接收方式。

object[]数组

List集合

Map集合

自定义实体类

我们还是通过例子来学习吧:查询所有博文,只返回标题和内容。

运行会发现出现以下异常:

a165aedae359b0622bd524f7b7f76e04.png

大概意思就是不能把Object转换成Blog类型。

接下来,我们使用上面所说的四种方式来解决这个问题,结果就不再一一展示了。ff1ddb16d5e9d26a709db7bee2db3e5a.png

1、Object[]数组方式

注意:如果只查询一个属性时,返回的就不再在数组,而是单个Object。

2、List集合方式

注意:HQL语句中的select后面,使用new List()的方式来接受数据。

3、Map集合方式

注意:如果new Map()中的属性没有取别名,则在for循环中通过get("下标")的形式来读取数据,特别注意,这儿是字符串"下标",而不是整数。

4、自定义实体类

4.1)在Blog实体类中添加包含标题和内容的构造方法

4.2)测试类中的代码

注意:HQL语句中查询几个属性,则在对应的实体类中必须的对应的构造方法。

四种方式到这儿就介绍完毕,至于哪种好哪种差,那就看个人习惯了。

继续后面的案例:

七、查询每个作者的博文数量(分组查询)

注意:分组之后的统计数据没办法保存到实体类,所以只能使用前三种方式来接受数据。

结果:

af6e9a76764094aaf0e8dd41d40532c8.png

八、查询所有的博文和作者(作者账号已经注销的不查(也就是博文表中作者ID为null的不查),多表联合查询)

注意:inner join后面的是Blog类中的author属性,Ojbect[]数组中保存的是两个对象。左连接的功能,大家自己尝试吧。

结果:

e2efaa506792a94c63bf3460ce794021.png

九、最后一个,查询博文数是2的所有作者(子查询)

结果:

f3411e3800e472154d312f3b90e7387c.png

呼~~~~~~

ba8be64f9732bdf845957c730c59c1f4.png,想不到我也能写出这么长的文章。

破了我30多年来的历史记录啊!!!激动得要

a12b1a2f2a773fc7398eeb7bd8a8b11c.png了。

恳请大大给我加个推荐吧~~b0c362a14e62cc3f1ef84d0ee17e9773.png

“软件思维”博客地址:51CTO,博客园,感兴趣的小伙伴可以去看相关的其它博文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值