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

SQL查询在Workbench中正常运行但Hibernate执行报错如何解决

报错原因定位

    1. 返回类型不匹配:你声明的方法返回值是List<Location>,但原生SQL只查询了account_id和拼接得到的location_id两个字段,没有返回Location实体对应的全量映射字段,Hibernate无法将稀疏的查询结果映射为完整的Location实体对象,会触发语法/映射类异常。
    1. SQL_MODE会话差异:Workbench和Hibernate建立的数据库会话的SQL_MODE配置不一致。如果Hibernate会话默认开启了ONLY_FULL_GROUP_BY模式,你的GROUP BY仅指定了account_id,但SELECT语句中的id字段既不在GROUP BY子句中,也没有被聚合函数包裹,不符合严格模式下的GROUP BY语法要求,虽然Workbench本地会话没开该模式可以正常执行,但Hibernate会话下会触发语法错误。
    1. 字段类型不匹配:GROUP_CONCAT返回的是字符串类型的拼接结果,如果Location实体中location_id字段定义为数字类型(比如Integer、Long),类型转换失败也会触发执行异常。

解决方案

方案1:修改返回类型适配查询结果

如果仅需要返回account_id和拼接后的location_id两个字段,不要用Location实体作为返回类型,用List<Object[]>接收结果即可,后续可自行转换为自定义DTO使用:

@Query(nativeQuery = true, value = "select account_id , GROUP_CONCAT(DISTINCT id SEPARATOR ',') AS location_id from locations ll where ll.parent_location in (SELECT id as building_id FROM locations l WHERE l.id IN (SELECT location_id as building_id FROM location_feature lf WHERE lf.feature_id = :featureId)) group by account_id")
List<Object[]> findByFeatureId(@Param("featureId") Integer featureId);

方案2:调整SQL符合严格GROUP BY规范

如果确实需要返回完整Location实体,调整SQL逻辑为查询完整实体字段,或者将所有非聚合查询字段都加入GROUP BY子句中即可适配ONLY_FULL_GROUP_BY模式要求。

方案3:临时关闭Hibernate会话严格模式(不推荐)

仅作为兼容老逻辑的临时方案,在数据库连接URL后追加会话变量配置即可:

jdbc:mysql://你的数据库地址/库名?sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'

内容的提问来源于stack exchange,提问作者SUDHIR KUMAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:45:02