You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate 5中org.hibernate.Criteria API已弃用报错的解决咨询

解决Hibernate 5中旧Criteria API弃用的警告问题

嗨,这个警告其实是Hibernate在提醒你:旧的org.hibernate.Criteria API已经被官方弃用了,推荐使用JPA标准的javax.persistence.criteria.CriteriaQuery来替代,这样你的代码也能更好地兼容JPA规范。

咱们直接来看怎么修改你的代码:

原来的旧写法(触发警告)

你的代码大概是类似这样的:

@Transactional
public class AccountDAOImpl implements AccountDAO {
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public ACCOUNTS findAccount(String userName) {
        Session session = sessionFactory.getCurrentSession();
        // 旧的Criteria API写法,会触发HHH90000022警告
        return (ACCOUNTS) session.createCriteria(ACCOUNTS.class)
                .add(Restrictions.eq("userName", userName))
                .uniqueResult();
    }
}

修改后的新写法(使用JPA CriteriaQuery)

替换成JPA标准的查询方式,就能消除警告了:

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.hibernate.query.Query;

@Transactional
public class AccountDAOImpl implements AccountDAO {
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public ACCOUNTS findAccount(String userName) {
        Session session = sessionFactory.getCurrentSession();
        
        // 1. 获取CriteriaBuilder,用来构建查询条件、表达式等
        CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
        // 2. 创建CriteriaQuery,指定查询返回的实体类型
        CriteriaQuery<ACCOUNTS> criteriaQuery = criteriaBuilder.createQuery(ACCOUNTS.class);
        // 3. 设置查询的根实体(对应数据库中的ACCOUNTS表)
        Root<ACCOUNTS> root = criteriaQuery.from(ACCOUNTS.class);
        // 4. 添加查询条件:匹配userName字段与传入参数
        criteriaQuery.select(root).where(criteriaBuilder.equal(root.get("userName"), userName));
        // 5. 创建Query对象并执行查询,获取唯一结果
        Query<ACCOUNTS> query = session.createQuery(criteriaQuery);
        return query.getSingleResult();
    }
}

关键步骤说明

  • CriteriaBuilder:JPA提供的查询构建工具,负责创建条件、排序、聚合等查询元素
  • CriteriaQuery:定义查询的整体结构,包括返回类型、查询目标、筛选条件等
  • Root:代表查询的实体根,相当于SQL语句中FROM子句指定的表
  • getSingleResult():作用和旧API的uniqueResult()一致,用于获取唯一匹配的查询结果

这样修改后,那个烦人的弃用警告就会消失,同时代码也更贴合JPA的标准规范哦~

内容的提问来源于stack exchange,提问作者user2715085

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:15:37