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 个步骤是不是更加容易帮助你理解了呢?
上一篇: Spring Batch 异步调用任务
推荐阅读
-
JSP 开发之hibernate配置二级缓存的方法
-
C#实现在前端网页弹出警告对话框(alert)的方法
-
Hibernate懒加载之
标签上的lazy -
Hibernate的Session_flush与隔离级别代码详解
-
IE浏览器当前网页正在试图打开您的受信任的站点列表中的站点的警告解决办法
-
非常实用的php弹出错误警告函数扩展性强
-
关于php程序报date()警告的处理(date_default_timezone_set)
-
struts2、hibernate、spring的工作原理[简明易懂]
-
Netkeeper打不开 警告:程序缺少必要组件的解决办法
-
解决vuejs 使用value in list 循环遍历数组出现警告的问题