今天在学习hibernate框架时,使用的5.2.13稳定版本,而在 hibernate 5.2 版本以后,对于 Criteria 查询重点放在了 JPACriteriaQuery API 上,如图

pic

所以造成的结果是

res

pic

方法的过时,同时其下对应的criteria查询的许多方法都属于过时的状态。怀着一颗与时俱进的心,我在网上百般寻找答案,但是百度给出的答案寥寥无几,有限的仅有简单的查询,后来去Google搜素,找寻多个网站以及翻官方文档和API,终于集合了解决方案用以应对criteria过时的问题。下面看看官方文档给出的API

pic

pic

官方给出的解决方案就是JPA 的 criteria,作为一名合格的爱学习的大学生,我当然不会一个一个的翻阅这些英文文档。不过呢,我还是先了解了下criteria查询的好处。

  • hibernate 自创的,无查询语句,面向对象查询。
  • 全都通过调用方法查询
  • 注意,很多方法在5.2版本的hibernate中已经弃用,官方API如下
  • **HQL相比,完全面向对象,不需要任何SQL基础 **

当然,我是比较喜欢这种设置参数就可操作表的查询的,所以对其一些基本的操作在hibernate5.2版本以后进行了学习。由于百度收录的关于hibernate 5.2更新版本后的 criteria查询资料极其稀少,所以我就打算记下来。但是由于博客正在学习与建设中,只有暂时存放于此处以便取用。在这之前,做必要的准备,例如hibernate的基本配置、导包等都不再赘述,给出数据库表结构与数据如下:

pojo

pojo类如下

aaaa

其中由于hibernate硬性规定使用id,而我的pid使用的是string类型,所以我建立了一个代理id,用来表的业务列中,没有某业务列符合但是却,必须有,并创建一个没有业务意义的列作为主键。

然后,建立一个获取session对象的工具类。

last

一、基本查询

曾经的方法

last

但是同样,createCriteria已经属于过时的方法,Hibernate5.2中已不推荐使用Criteria,而是使用基于JPA规范的CriteriaQuery查询。通过百度以及API,采用新的第一种方法如下:

last

  1. 创建一个CriteriaBuilder
  2. 获取 CriteriaQuery
  3. 指定实体 criteria.from(Product.class);
  4. 执行查询 session.createQuery 获取结果集 .getResultList()

简化后代码如下:

last

同时,官网给出另外一种方法,选择根实体,示例如下图

last

根据官网给出的示例,书写代码如下:

last

不获取根实体的情况,分析如下:

  1. 创建一个CriteriaBuilder
  2. 获取 CriteriaQuery
  3. 选择根实体 Root
  4. 执行查询 session.createQuery
  5. 获取结果集 .getResultList()

查询指定字段,通过CriteriaQuery的select具体设置

last

二、条件查询

对于原方法,条件查询如下:

last

由于方法的过时,采用5.2新定义的方法,此时,必须为其定义根实体

last

此处需要使用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是,是一层又一层的嵌套。

last

此时即完成了条件查询

根据条件查询指定字段。将以上两种方式结合即可。

last

三、分页查询

hibernate 5.2以前

last

现在5.2修改后,找遍多种途径都没寻求到方法,不得已,我使用了其他的方法,采用 JPA 标准下的persistence 包下的 TypedQuery 来进行分页。

last

如此,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标准降低了运行时失败,因为编译器动态检查查询错误。

四、分页查询之查询总条数

last

同样,由于使用JPA,我们不得不更换方式。这个时候就需要使用到mysql的聚合函数来处理数据,在百度查询无果后,去查询官方API文档,他给出了聚合函数使用如下:

last

研究半天终于使用其聚合函数获取到了,后面的聚合函数都可以使用同样的方式

last

last

如此即成功使用其聚合函数获取到了其总条数。

致此,简单的查询就这些了。差不多如此,花了不少时间终于全部弄懂了。相比起HQL,在自己研究的下,还是Criteria 查询较为难,hibernate这个框架感觉相比于mybatis更加上升了一个高度,如果说jdbc底层,连接池上升一层,mybatis再升一层,那么hibernate相比于mybatis应该上升了两层吧。

差不多就这些了,晚安各位~月亮

再吐槽一遍QQ空间的编辑器=-=要不是因为我博客还没建好,我也不会用这个=-=希望下次不用了。上传图片截屏排版键值要我老命。。。。唯一好点的就是挺喜欢荧光字体。

念念不忘,必有回响。