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

自定义HQL查询报错:ResultTransformer不允许用于'select new'查询

解决HQL报错:ResultTransformer is not allowed for 'select new' queries

这问题我之前也碰到过,其实原因很清晰:你同时用了两种冲突的结果转换方式。

当你在HQL里写SELECT new map(p as plan, pei.stateCodeId as state)的时候,已经明确告诉Hibernate要把查询结果转换成Map结构了——这本身就是一种内置的结果转换逻辑。但这时候你的代码里肯定还额外调用了setResultTransformer()方法(比如设置了别名转Bean或者其他转换器),Hibernate不允许同时存在两种结果转换规则,所以就抛出了这个错误。

两种解决方案任你选:

  1. 移除ResultTransformer设置
    既然已经用了new map语法,Hibernate会自动帮你把结果转换成对应的Map集合,完全不需要再额外设置转换器。找到代码里类似query.setResultTransformer(...)的行删掉就行,查询返回的结果就是Map<String, Object>类型的列表,键就是你定义的plan和state。

  2. 保留ResultTransformer,去掉new map语法
    如果你的业务逻辑确实需要用自定义的ResultTransformer,那把HQL里的new map去掉,改成普通的别名查询:

    StringBuilder q = new StringBuilder();
    q.append(" SELECT DISTINCT p as plan, pei.stateCodeId as state ");
    q.append(" FROM PlanEligibilityIndex pei ");
    

    然后再设置你需要的转换器,比如转成自定义DTO:

    query.setResultTransformer(Transformers.aliasToBean(YourCustomDto.class));
    

    或者如果还是要转成Map,也可以用内置的转换器:

    query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    

简单说就是:select new语法和ResultTransformer是互斥的,只能选一种方式来处理查询结果,这是Hibernate的设计限制,避免转换逻辑冲突导致混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:30:48