非唯一发现数据终端SqlAlias两个表具有相同的列名时的异常

2022-09-01 15:28:05

我有两个表和 - 其定义如下所示:ItemNikasa

Item { id, name, spec}和 这里 代表 .Nikasa {id, date, item_id}.item_idItem.id

我做了一个简单的本机SQL联接,仅选择并作为:Item.idNikasa.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();

但我在行中得到例外:NonUniqueDiscoveredSqlAliasException : Encountered a duplicated sql alias [ID] during auto-discovery of a native-sql queryList result=sq.list();

堆栈跟踪 :

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)

你能建议一下发生了什么问题吗?


答案 1

您需要设置结果别名。

SELECT it.id as itemid, nik.id as nikasaid FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)

答案 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)

或为这两个列指定别名。


推荐