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

为何触发NonUniqueDiscoveredSqlAliasException异常?SQL问题排查

问题分析:Hibernate原生SQL查询报NonUniqueDiscoveredSqlAliasException异常

问题场景

现有book与book_version两张表,需筛选满足以下条件的书籍:

  • 版本为最新版本,或v.generated_from_another为NULL(表示非稳定版本)
  • 指定类型

执行以下原生SQL在MySQL中可正常运行,但触发Hibernate异常:

SELECT b.id, b.book_name, v.id, v.majorVersion, v.minorVersion, v.generated_from_another IS NULL as isNotStable
FROM book b
         INNER JOIN book_version v ON b.id = v.book_id
WHERE b.type = :typeId
  and (v.id in (SELECT max(v.id)
                FROM book b
                         INNER JOIN book_version v ON b.id = v.book_id
                WHERE v.generated_from_another IS NULL
                  AND b.type = :typeId
                GROUP BY b.id) or v.generated_from_another is not null)
ORDER BY b.book_name, v.majorVersion DESC, v.minorVersion DESC;

报错详情

Caused by:
org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException:
Encountered a duplicated sql alias [id] during auto-discovery of a
native-sql query  at
org.hibernate.loader.custom.CustomLoader.validateAliases(CustomLoader.java:520)
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]   at
org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:497)
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]   at
org.hibernate.loader.Loader.preprocessResultSet(Loader.java:2343)
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]   at
org.hibernate.loader.Loader.getResultSet(Loader.java:2299)
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]

问题原因

你的SQL查询中同时选取了b.id(书籍ID)和v.id(版本ID),这两个字段在查询结果集中的默认别名都是id。Hibernate在自动映射原生SQL结果时,要求所有列的别名必须唯一,重复的别名会导致它无法正确识别和映射字段,从而抛出NonUniqueDiscoveredSqlAliasException异常。

解决方案

给重复的列指定唯一的别名,修改后的SQL如下:

SELECT b.id as book_id, b.book_name, v.id as version_id, v.majorVersion, v.minorVersion, v.generated_from_another IS NULL as isNotStable
FROM book b
         INNER JOIN book_version v ON b.id = v.book_id
WHERE b.type = :typeId
  and (v.id in (SELECT max(v.id)
                FROM book b
                         INNER JOIN book_version v ON b.id = v.book_id
                WHERE v.generated_from_another IS NULL
                  AND b.type = :typeId
                GROUP BY b.id) or v.generated_from_another is not null)
ORDER BY b.book_name, v.majorVersion DESC, v.minorVersion DESC;

内容的提问来源于stack exchange,提问作者Daniela Morais

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:20:12