2021-01-23
今天在学习hibernate框架时,使用的5.2.13稳定版本,而在 hibernate 5.2 版本以后,对于 Criteria 查询重点放在了 JPACriteriaQuery API 上,如图
所以造成的结果是
方法的过时,同时其下对应的criteria查询的许多方法都属于过时的状态。怀着一颗与时俱进的心,我在网上百般寻找答案,但是百度给出的答案寥寥无几,有限的仅有简单的查询,后来去Google搜素,找寻多个网站以及翻官方文档和API,终于集合了解决方案用以应对criteria过时的问题。下面看看官方文档给出的API
官方给出的解决方案就是JPA 的 criteria,作为一名合格的爱学习的大学生,我当然不会一个一个的翻阅这些英文文档。不过呢,我还是先了解了下criteria查询的好处。
- hibernate 自创的,无查询语句,面向对象查询。
- 全都通过调用方法查询
- 注意,很多方法在5.2版本的hibernate中已经弃用,官方API如下
- **HQL相比,完全面向对象,不需要任何SQL基础 **
当然,我是比较喜欢这种设置参数就可操作表的查询的,所以对其一些基本的操作在hibernate5.2版本以后进行了学习。由于百度收录的关于hibernate 5.2更新版本后的 criteria查询资料极其稀少,所以我就打算记下来。但是由于博客正在学习与建设中,只有暂时存放于此处以便取用。在这之前,做必要的准备,例如hibernate的基本配置、导包等都不再赘述,给出数据库表结构与数据如下:
pojo类如下
其中由于hibernate硬性规定使用id,而我的pid使用的是string类型,所以我建立了一个代理id,用来表的业务列中,没有某业务列符合但是却,必须有,并创建一个没有业务意义的列作为主键。
然后,建立一个获取session对象的工具类。
一、基本查询
曾经的方法
但是同样,createCriteria已经属于过时的方法,Hibernate5.2中已不推荐使用Criteria,而是使用基于JPA规范的CriteriaQuery查询。通过百度以及API,采用新的第一种方法如下:
- 创建一个CriteriaBuilder
- 获取 CriteriaQuery
- 指定实体 criteria.from(Product.class);
- 执行查询 session.createQuery 获取结果集 .getResultList()
简化后代码如下:
同时,官网给出另外一种方法,选择根实体,示例如下图
根据官网给出的示例,书写代码如下:
不获取根实体的情况,分析如下:
- 创建一个CriteriaBuilder
- 获取 CriteriaQuery
- 选择根实体 Root
- 执行查询 session.createQuery
- 获取结果集 .getResultList()
查询指定字段,通过CriteriaQuery的select具体设置
二、条件查询
对于原方法,条件查询如下:
由于方法的过时,采用5.2新定义的方法,此时,必须为其定义根实体
此处需要使用CriteriaQuery的where方法,其中参数为Predicate类型,所以我们用CriteriaBuilder的方法来进行查询,包括equal、gt等,对应如下:
关系 | 方法 |
---|---|
大于(>) | gt |
大于等于(>=) | ge |
小于(<) | lt |
小于等于(<=) | le |
等于(==) | eq |
不等于(!=) | ne |
in | in |
between and | between |
like | lisk |
not null | isNotNull |
is not null | isNull |
or | or |
and | and |
不过在处理OR或者AND是,是一层又一层的嵌套。
此时即完成了条件查询
根据条件查询指定字段。将以上两种方式结合即可。
三、分页查询
hibernate 5.2以前
现在5.2修改后,找遍多种途径都没寻求到方法,不得已,我使用了其他的方法,采用 JPA 标准下的persistence 包下的 TypedQuery 来进行分页。
如此,hibernate 5.2的分页查询就实现了。当然此方法由文档所给出的如下
This is useful when the aim is to create dynamic, failure-safe queries. In contrast to “hard-coded”, “string-based” JQL or HQL queries, JPA Criteria reduces run-time failures because the compiler dynamically checks for query errors.
翻译:当创建动态的、故障安全的查询时,这一点非常有用。相对于“硬编码”、“基于字符串的“JQL 或HQL查询,JPA标准降低了运行时失败,因为编译器动态检查查询错误。
四、分页查询之查询总条数
同样,由于使用JPA,我们不得不更换方式。这个时候就需要使用到mysql的聚合函数来处理数据,在百度查询无果后,去查询官方API文档,他给出了聚合函数使用如下:
研究半天终于使用其聚合函数获取到了,后面的聚合函数都可以使用同样的方式
如此即成功使用其聚合函数获取到了其总条数。
致此,简单的查询就这些了。差不多如此,花了不少时间终于全部弄懂了。相比起HQL,在自己研究的下,还是Criteria 查询较为难,hibernate这个框架感觉相比于mybatis更加上升了一个高度,如果说jdbc底层,连接池上升一层,mybatis再升一层,那么hibernate相比于mybatis应该上升了两层吧。
差不多就这些了,晚安各位~月亮
再吐槽一遍QQ空间的编辑器=-=要不是因为我博客还没建好,我也不会用这个=-=希望下次不用了。上传图片截屏排版键值要我老命。。。。唯一好点的就是挺喜欢荧光字体。
念念不忘,必有回响。