【问题标题】:NonUniqueDiscoveredSqlAliasException being thrown incorrectlyNonUniqueDiscoveredSqlAliasException 被错误抛出
【发布时间】:2018-07-30 13:16:29
【问题描述】:

我有这个有点庞大的查询,当我在 SQL Server Management Studio 上运行它时,它会返回正确的结果:

SELECT a.id, a.name, 'ANALYSIS' AS type, NULL, NULL, NULL FROM Analysis a WHERE a.category_neoId IS NULL 

UNION 

SELECT bp.neoId, bp.name, 'BUSINESS_PERFORMANCE' AS type, sc.defaultPermission, sp.flags, sp.securityEntity_neoId FROM BPQuery bp LEFT JOIN SecurityController sc ON bp.userSecurityController_neoId = sc.neoId LEFT JOIN SecurityPermission sp ON bp.userSecurityController_neoId = sp.controller_neoId WHERE bp.category_neoId IS NULL 

UNION 

SELECT bpc.neoId, bpc.name, 'BUSINESS_PERFORMANCE_CONSOLIDATED' AS type, NULL, NULL, NULL FROM BPConsolidatedQuery bpc WHERE bpc.category_neoId IS NULL 

UNION 

SELECT ip.neoId, ip.name, 'INDICATORS_PANEL' AS type, sc.defaultPermission, sp.flags, sp.securityEntity_neoId FROM NeoDashBoard ip LEFT JOIN SecurityController sc ON ip.userSecurityController_neoId = sc.neoId LEFT JOIN SecurityPermission sp ON ip.userSecurityController_neoId = sp.controller_neoId WHERE ip.category_neoId IS NULL 

UNION 

SELECT r.neoId, r.name, 'REPORT' AS type, sc.defaultPermission, sp.flags, sp.securityEntity_neoId FROM NeoReport r LEFT JOIN SecurityController sc ON r.userSecurityController_neoId = sc.neoId LEFT JOIN SecurityPermission sp ON r.userSecurityController_neoId = sp.controller_neoId WHERE r.category_neoId IS NULL

但是,当我在 entityManager.createNativeQuery(thisHugeQuery).getResultList() 上运行它时,它会引发以下异常:

org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql alias [] during auto-discovery of a native-sql query

我真的找不到任何真正的重复查询。 SecurityPermission 和 SecurityController 是唯一重复的别名(scsp),但据我所知,因为我没有从中选择,只是加入和引用相同的表,所以对于休眠以正确识别它。

【问题讨论】:

  • 在第一个选择中,您有三倍 NULL, NULL, NULL 并且没有别名。你应该给他们一个。 (当然他们每个人都有不同的别名)

标签: sql sql-server hibernate


【解决方案1】:

这是因为您没有最后 3 列的列名。为这三列中的每一列提供一个列别名,这应该可以工作。

顺便说一句,您可以考虑使用 UNION ALL,除非您尝试只返回不同的行。

【讨论】:

    【解决方案2】:

    您可以尝试给第一个查询的最后三列提供NULL 别名。否则这些列是没有名字的。

    SELECT a.id, 
           a.NAME, 
           'ANALYSIS' AS type, 
           NULL as 'defaultpermission', 
           NULL as 'flags', 
           NULL as 'securityentity_neoid'
    FROM   analysis a 
    WHERE  a.category_neoid IS NULL 
    UNION 
    SELECT bp.neoid, 
           bp.NAME, 
           'BUSINESS_PERFORMANCE' AS type, 
           sc.defaultpermission, 
           sp.flags, 
           sp.securityentity_neoid 
    FROM   bpquery bp 
           LEFT JOIN securitycontroller sc 
                  ON bp.usersecuritycontroller_neoid = sc.neoid 
           LEFT JOIN securitypermission sp 
                  ON bp.usersecuritycontroller_neoid = sp.controller_neoid 
    WHERE  bp.category_neoid IS NULL 
    UNION 
    SELECT bpc.neoid, 
           bpc.NAME, 
           'BUSINESS_PERFORMANCE_CONSOLIDATED' AS type, 
           NULL, 
           NULL, 
           NULL 
    FROM   bpconsolidatedquery bpc 
    WHERE  bpc.category_neoid IS NULL 
    UNION 
    SELECT ip.neoid, 
           ip.NAME, 
           'INDICATORS_PANEL' AS type, 
           sc.defaultpermission, 
           sp.flags, 
           sp.securityentity_neoid 
    FROM   neodashboard ip 
           LEFT JOIN securitycontroller sc 
                  ON ip.usersecuritycontroller_neoid = sc.neoid 
           LEFT JOIN securitypermission sp 
                  ON ip.usersecuritycontroller_neoid = sp.controller_neoid 
    WHERE  ip.category_neoid IS NULL 
    UNION 
    SELECT r.neoid, 
           r.NAME, 
           'REPORT' AS type, 
           sc.defaultpermission, 
           sp.flags, 
           sp.securityentity_neoid 
    FROM   neoreport r 
           LEFT JOIN securitycontroller sc 
                  ON r.usersecuritycontroller_neoid = sc.neoid 
           LEFT JOIN securitypermission sp 
                  ON r.usersecuritycontroller_neoid = sp.controller_neoid 
    WHERE  r.category_neoid IS NULL 
    

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多