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
相关产品推荐
相关产品推荐

