Hibernate 6.0.0升级后出现QueryTypeMismatchException问题求助
Hibernate 6.0.0 QueryTypeMismatchException 原因及解决方法
异常原因
Hibernate 6.0.0对Criteria API的类型校验机制做了强化,会严格校验CriteriaQuery声明的泛型类型与实际查询选择的实体类型是否一致。
你的代码中,CriteriaQuery<T>声明的结果类型是父类TestEntitiyParent,但实际通过criteria.select(join)选择的是关联的子类TestEntitiyChildren,两者类型不匹配。旧版本中这种不一致可能被隐式忽略,但Hibernate 6会直接抛出QueryTypeMismatchException;错误信息里的“multiple selections”是框架解析时的附带提示,核心问题还是类型不匹配。
解决方法
核心是让CriteriaQuery的泛型类型与查询选择的实体类型保持一致,具体调整如下:
方法1:直接修正CriteriaQuery的泛型类型
如果查询目标是关联的子类(TestEntitiyChildren),创建CriteriaQuery时直接指定子类类型,而非父类:
CriteriaBuilder builder = session.getCriteriaBuilder(); // 替换为实际要查询的子类类型 CriteriaQuery<TestEntitiyChildren> criteria = builder.createQuery(TestEntitiyChildren.class); Root<TestEntitiyParent> root = criteria.from(TestEntitiyParent.class); // 明确Join的泛型类型,关联属性名替换为你的实际字段 Join<TestEntitiyParent, TestEntitiyChildren> join = root.join("children"); criteria.select(join).where(builder.equal(root.get(nameField), id)); TypedQuery<TestEntitiyChildren> query = session.createQuery(criteria); List<TestEntitiyChildren> resultList = query.getResultList();
方法2:调整泛型参数(适用于通用代码)
如果代码是泛型实现,确保泛型参数T对应join的目标实体类型,而非父类:
// 确保调用此方法时,T是关联子类的类型,classe传入子类的Class对象 CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<T> criteria = builder.createQuery(classe); Root<? super T> root = criteria.from(fatherClass); Join<? super T, T> join = root.join(table); criteria.select(join).where(builder.equal(root.get(nameField), id)); TypedQuery<T> query = session.createQuery(criteria); List<T> resultList = query.getResultList();
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

