自定义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不允许同时存在两种结果转换规则,所以就抛出了这个错误。
两种解决方案任你选:
移除ResultTransformer设置
既然已经用了new map语法,Hibernate会自动帮你把结果转换成对应的Map集合,完全不需要再额外设置转换器。找到代码里类似query.setResultTransformer(...)的行删掉就行,查询返回的结果就是Map<String, Object>类型的列表,键就是你定义的plan和state。保留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
相关产品推荐
相关产品推荐

