Hibernate 的 HHH90000022 警告
这个警告通常在你升级 Hibernate 后会出现,主要是提示你应该使用 JPA 来进行查询。
警告信息如下:
HHH90000022: Hibernate's legacy org.hibernate.Criteria API is deprecated; use the JPA javax.persistence.criteria.CriteriaQuery instead
老的查询方式
考察下面的代码:
Factory.getSession().createCriteria(classArg);
上面的代码是获得一个 Session 后创建 createCriteria 来进行查询。
如果你查看 createCriteria 这个方法的源代码的话。
上面提示这个查询方法将会逐步被丢弃。
因此不建议你继续使用。
考察下面的代码,我们是来从一个实体对象中进行查询。
Criteria cr = Factory.createCriteria(MlsListing.class);cr.add(Restrictions.ge("dateM", new DateTime().minusDays(100).toDate()));cr.addOrder(Order.desc("dateM"));
上面的代码是首先通过实体创建一个 Criteria,然后再设置查询条件。
如果使用 JPA 的话就不能这样写了。
JPA 写法
与上面对应的是 JPA 的写法。
完整的代码如下:
CriteriaBuilder builder = Factory.getSession().getCriteriaBuilder();CriteriaQuery<MlsListing> criteriaQuery = builder.createQuery(MlsListing.class);Root<MlsListing> root = criteriaQuery.from(MlsListing.class);criteriaQuery.select(root);criteriaQuery.where(builder.greaterThan(root.get("dateM"), new DateTime().minusDays(100).toDate()));
// criteriaQuery.where(builder.greaterThan(root.get(MlsListing_.DATE_M), new DateTime().minusDays(100).toDate()));Query query = Factory.getSession().createQuery(criteriaQuery);query.setMaxResults(1000);mlsListingList = query.getResultList();
代码解读
- 需要从 Session 中获得 CriteriaBuilder 实例
- 从 CriteriaBuilder 实例中创建 CriteriaQuery
- 从 CriteriaQuery 中创建 Root 实例
- 将 root 实例返回设置到 CriteriaQuery 中
- 在 CriteriaQuery 中创建 Where,Order 等条件
- 从 Session中获得 Query 实例,在创建这个 Query 实例的时候需要 CriteriaQuery 才可以创建。
- 为 Query 设置返回参数集
- 执行查询
如果单纯的从步骤的角度来说,上面的过程更加复杂了。
原因有,从 Session 中需要获得 CriteriaBuilder 和 Query 2 个实例。
CriteriaQuery 的创建需要实体。
CriteriaQuery 需要解决 2 个问题,从哪里去查询,实际上是从 Root 去查询,这个是 select 这个语句表达的。
查询条件是什么,这个是 where 语句表达的。
因为是 从 Root 里面查,所以需要设置 Root 对象,root 对象又是从 criteriaQuery 中的 from 来的。
正是因为上面的问题,才导致这个 JPA 查询有点绕。
总结
对 JPA 的查询我们进行一个小总结。
查询的基础是从 session 中运行 Query 语句。
第一步,从 Session 中创建 CriteriaBuilder ,这个不需要实体类。
第二步,从 CriteriaBuilder 的实例中创建 CriteriaQuery,这个需要实体类,同时解决从哪里查(Root)和 怎么查的问题(Select 和 Where)
第三步,执行查询,这个步骤需要从 Session 中创建 Query ,并且执行 CriteriaQuery 的实例。
通过上面 3 个步骤是不是更加容易帮助你理解了呢?
Hibernate 的 HHH90000022 警告 - Java - OSSEZ
Hibernate 的 HHH90000022 警告相关推荐
- (12) Hibernate+EhCache配置二级缓存
转载地址 http://jyao.iteye.com/blog/1315726 (有关EhCache的基础介绍可参见:http://sjsky.iteye.com/blog/1288257 ) 本文主 ...
- java 实体类 临时注解_JPA:Java持久层API--配置流程
一.JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- 国产数据库人大金仓踩坑记录和函数适配
文章目录 总体介绍 注意事项(踩的坑) 函数适配(持续更新) 技巧 总体介绍 人大金仓,是国产数据管理软件与服务提供商.主要服务于电子政务.党务.国防军工.金融.智慧城市.企业信息化等行业.在北京.上 ...
- java sqlexception_java.sql.SQLException
java.sql.SQLException: ResultSet is closed是什么错误 java.sql.SQLException:ResultSetisclosed是什么错误 java.sq ...
- JPA---Java持久层API
JPA讲义 Java持久层API 目 录 1 JPA概述................................................................ ...
- Hibernate 和 JPA
Hibernate 在 5 以后的版本中全面推进使用 JPA 的查询语法,甚至准备废弃掉自己已有的查询语法. 什么是 JPA JPA 全称为 Java Persistence API ,Java 持久 ...
- mybatis与mysql的优点_mybatis和hibernate比较_区别_优缺点
前言 Hibernate与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8.而Mybatis相对平静,工具较少,当前最 ...
- Spring ORM数据訪问——Hibernate
Hibernate 我们将首先介绍Spring环境中的Hibernate 5.然后介绍使用Hibernate 5来演示Spring集成O-R映射器的方法. 本节将具体介绍很多问题,并显示DAO实现和事 ...
- Hibernate用Mysql数据库时链接关闭异常的解决
在一个项目中,客户要求除操作系统外全部使用免费软件,因此我使用了Mysql 4.0作为数据库服务器,其JDBC驱动为3.0.9版本,在给客户安装后调试一切正常.可是到了第二天,只要一登录就提示&quo ...
- 浅析 Mybatis 与 Hibernate 的区别与用途
有很长一段时间对mybatis是比较陌生的,只知道与Hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与Hibernate区别是非常大的,应当结合不同的情况分析选用.结合至今为止 ...
最新文章
- 计算机专插本专业考哪些科目,2020年广东专插本要考什么?专插本考试科目有哪些?...
- throw throws 区别
- 6.2 常见多媒体标准及压缩技术
- 开源创新的理念_开源如何解决创新问题
- DNW启动异常的问题
- oracle xsql详解(二)
- 关于try...catch...finally中return的疑惑
- python学习之课后习题
- 收到控制台警告:当我在iOS13.2中加载WKWebView时,[Process] kill() returned unexpected error 1
- [C/C++]如何在ARM环境下进行开发
- 慧荣SM2259XT主控贴镁光B27A测试分享,SM2258XT、SM2259XT2可参考
- 【YBT2022寒假Day1 B】方格填写(插头DP)
- Socket 服务器和客户端交互
- 爱老虎油和你探索flash中的对象
- 腾讯微云 for Mac v
- 学习方法和学习经验总结
- ABP 部署遇到的问题(记录)
- python中列表概念,Python 列表的简单介绍
- Liunx系统格式化磁盘和挂载备份盘
- ATTCK红日靶场二