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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:52:33