NonUniqueDiscoveredSqlAliasException 当两个表具有相同的列名时
Posted
技术标签:
【中文标题】NonUniqueDiscoveredSqlAliasException 当两个表具有相同的列名时【英文标题】:NonUniqueDiscoveredSqlAliasException when two table has same column names 【发布时间】:2012-05-26 16:28:31 【问题描述】:我有两个表 Item
和 Nikasa
- 其定义如下:
Item id, name, spec
和Nikasa id, date, item_id.
这里item_id
代表Item.id
。
我做了一个简单的原生 SQL 连接,只选择 Item.id
和 Nikasa.id
作为:
Session s = getSession();
SQLQuery sq = s.createSQLQuery("SELECT it.id, nik.id FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)");
List result = sq.list();
但我在List result=sq.list();
行遇到异常NonUniqueDiscoveredSqlAliasException : Encountered a duplicated sql alias [ID] during auto-discovery of a native-sql query
:
堆栈跟踪:
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.autoDiscoverTypes(CustomLoader.java:594)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1986)
at org.hibernate.loader.Loader.doQuery(Loader.java:829)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
at org.hibernate.loader.Loader.doList(Loader.java:2463)
at org.hibernate.loader.Loader.doList(Loader.java:2449)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279)
at org.hibernate.loader.Loader.list(Loader.java:2274)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1585)
at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:224)
at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156)
您能否建议发生了什么问题?
【问题讨论】:
看来我解决了。SELECT it.id as iid, nik.id as nid
揭开了谜底。
【参考方案1】:
您需要设置结果别名。
SELECT it.id as itemid, nik.id as nikasaid FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)
【讨论】:
嗨,我在 Hibernate 3 中遇到了异常。您测试了哪个版本?能否请你确认。谢谢,凯瑟尔 如果我想获取所有列而不是某些列怎么办?【参考方案2】:如果您在 SQL 工作台中运行查询,您会发现表名与两列的 id 相同。 Hibernate 将其视为重复的,因此需要别名。 让我们假设您有查询:
SELECT it.id, nik.id FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)
SQL 工作台上列名的输出将是:
id | id |
在那里正常工作。 但是对于休眠它需要唯一的列名。所以你需要在任何一个列中添加别名
SELECT it.id as it_id, nik.id FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)
或
SELECT it.id , nik.id as nik_id FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)
或者给这两个列一个别名。
【讨论】:
以上是关于NonUniqueDiscoveredSqlAliasException 当两个表具有相同的列名时的主要内容,如果未能解决你的问题,请参考以下文章