有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当两个表的列名相同时,java UnuniqueDiscoveredSqlAlias异常

我有两个表ItemNikasa,它们的定义如下:

Item { id, name, spec}Nikasa {id, date, item_id}.这里item_id代表Item.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();

但是我在第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)

你能告诉我发生了什么事吗


共 (2) 个答案

  1. # 1 楼答案

    您需要设置结果别名

    SELECT it.id as itemid, nik.id as nikasaid FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)
    
  2. # 2 楼答案

    如果在SQL workbench中运行查询,您会发现表名与两列的id相同。Hibernate将其视为重复的,因此需要别名。 假设你有疑问:

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

    SQL workbench上的列名输出将是:

    id | id |
    

    这在那里是正确的。 但对于hibernate,它需要唯一的列名。所以你需要在任何一列中添加别名

    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)
    

    或者给这两列都加一个别名