开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
  1. Home
  2. Computer Science
  3. This article

Hibernate 的 HHH90000022 警告

2022年01月14日 814Browse 0Like 0Comments

这个警告通常在你升级 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 这个方法的源代码的话。

 

2022-01-13_11-23-52

 

上面提示这个查询方法将会逐步被丢弃。

因此不建议你继续使用。

考察下面的代码,我们是来从一个实体对象中进行查询。

            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();

代码解读

  1. 需要从 Session 中获得 CriteriaBuilder 实例
  2. 从 CriteriaBuilder 实例中创建 CriteriaQuery
  3. 从 CriteriaQuery 中创建 Root 实例
  4. 将 root 实例返回设置到 CriteriaQuery 中
  5. 在 CriteriaQuery 中创建 Where,Order 等条件
  6. 从 Session中获得 Query 实例,在创建这个 Query 实例的时候需要 CriteriaQuery 才可以创建。
  7. 为 Query 设置返回参数集
  8. 执行查询

如果单纯的从步骤的角度来说,上面的过程更加复杂了。

原因有,从 Session 中需要获得 CriteriaBuilder 和 Query 2 个实例。

CriteriaQuery 的创建需要实体。

CriteriaQuery 需要解决 2 个问题,从哪里去查询,实际上是从 Root 去查询,这个是 select 这个语句表达的。

查询条件是什么,这个是 where 语句表达的。

因为是 从 Root 里面查,所以需要设置 Root 对象,root 对象又是从 criteriaQuery 中的 from 来的。

正是因为上面的问题,才导致这个 JPA 查询有点绕。

总结

对 JPA 的查询我们进行一个小总结。

 

JPA-hibernate-01

 

查询的基础是从 session 中运行 Query 语句。

第一步,从 Session 中创建 CriteriaBuilder ,这个不需要实体类。

第二步,从 CriteriaBuilder 的实例中创建 CriteriaQuery,这个需要实体类,同时解决从哪里查(Root)和 怎么查的问题(Select 和 Where)

第三步,执行查询,这个步骤需要从 Session 中创建 Query ,并且执行 CriteriaQuery 的实例。

通过上面 3 个步骤是不是更加容易帮助你理解了呢?

 

https://www.ossez.com/t/hibernate-hhh90000022/13852

Tags: None
Last updated:2022年01月14日

HoneyMoose

有温度的人文和独立的思考

Like
< Previous
Next >

Comments

Cancel reply

Archives
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,362)
    • Confluence (663)
    • Gradle (12)
  • U.S. (482)
  • 文化旅游 (145)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1