迁移Hibernate实现到新包后出现同类型不匹配的QueryTypeMismatchException异常求助
嘿,遇到这种“明明是同一个类型却报错不匹配”的问题确实挺挠头的!我来帮你分析下可能的原因和解决思路:
首先先明确你的问题:你把Hibernate实现从com.mvc.data包迁移到com.mvc.frontend包后,查询数据时抛出了这个异常:
org.hibernate.query.QueryTypeMismatchException: Specified result type [com.mvc.frontend.enteties.Customer] did not match Query selection type [com.mvc.frontend.enteties.Customer] - multiple selections: use Tuple or array
而且你发现报错里的两个类型完全一样,这就更奇怪了。
下面是几个大概率能解决问题的方向:
检查你的查询语句写法:这是最常见的原因!你是不是在HQL/JPQL里写了类似
select c.id, c.name from Customer c这种只选部分字段的语句?如果是这样,哪怕你想把结果转成Customer对象,Hibernate也会因为查询返回的是多个独立字段(而不是完整的实体实例),所以抛出这个异常。- 解决办法:如果要获取完整的Customer对象,把查询改成
select c from Customer c;如果确实只需要部分字段,那就按照提示用Tuple或者数组接收结果,比如用Query<Tuple>或者Query<Object[]>来创建查询。
- 解决办法:如果要获取完整的Customer对象,把查询改成
仔细核对包名和类名的拼写:你看报错里的包名是
com.mvc.frontend.enteties.Customer,这里的enteties是不是拼写错误?正常应该是entities吧?如果你的实体类实际包名是com.mvc.frontend.entities.Customer,但查询或者配置里写错了拼写,类加载器会把它当成完全不同的类型,哪怕名字看起来差不多。更新Hibernate的实体映射配置:迁移包之后,你有没有同步更新
persistence.xml、hibernate.cfg.xml或者注解里的相关配置?如果配置文件里还在引用旧包的com.mvc.data.Customer,但你代码里用的是新包的类,也可能出现这种看似同类型的不匹配问题。清理项目缓存并重新编译:有时候IDE或者Maven/Gradle的缓存会搞鬼——旧包的Customer类文件没被彻底删除,导致类加载器加载了两个不同版本的类(哪怕全限定名一样,但来自不同的字节码文件)。这种情况下,你可以手动删除项目的
target(Maven)或build(Gradle)目录,然后重新编译整个项目。
如果上面的方法都没解决,你可以把你的查询代码贴出来,我再帮你针对性排查~
备注:内容来源于stack exchange,提问作者Charlie

