HSQLDB:遇到重复的 sql 别名

Posted

技术标签:

【中文标题】HSQLDB:遇到重复的 sql 别名【英文标题】:HSQLDB: Encountered a duplicated sql alias 【发布时间】:2016-10-20 15:24:02 【问题描述】:

当我使用 java 程序中的自联接执行此查询时

Query query = session.createSQLQuery("SELECT DISTINCT * " +
            "FROM lerneinheit AS le1 JOIN lerneinheit AS le2  " +
            "ON le1.datum = le2.datum AND le1.pid = le2.pid " +
            " WHERE " +
            "  le1.datum BETWEEN  '2016-10-20' AND '2016-10-20'  AND " +
            "  le1.pid = 3 AND " +
            "  (le1.abgesagtrechtzeitig = false OR  le1.nichtabgesagt = true OR le1.erschienen=true) AND " +
            "  (le2.abgesagtrechtzeitig = false OR  le2.nichtabgesagt = true OR le2.erschienen=true) AND " +
            "  le1.lernid!= le2.lernid AND " +
            "  (le2.beginn+1 BETWEEN le1.beginn AND le1.ende OR le2.ende-1 BETWEEN le1.beginn AND le1.ende) " +
            " ORDER BY le1.beginn");

我收到以下错误:

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

虽然如果我从 phpAdmin 执行此操作,它可以正常工作。我在该主题上找到的所有内容都没有帮助。有人知道如何解决这个问题吗?

【问题讨论】:

不要使用SELECT DISTINCT *,而是使用您实际需要的所有列的名称。使用列别名来区分两个表别名中的同一列。 @fredt 我的目的是获得一个管理 Lerneinheit-Objects 的列表。但似乎我将使用此查询来获取所有 id,并在另一个函数中尝试通过它们的 id 检索对象。 即便如此,您也不希望 SELECT 的每一行中有两个对象。你可以试试SELECT DISTINCT le1.* FROM ... 【参考方案1】:

我不确定,但 != 的 HQL 等效项是 <>,所以你应该写 " le1.lernid <> le2.lernid AND"

顺便说一句,我推荐:

Query query = session.createSQLQuery("SELECT DISTINCT * " +
        "FROM lerneinheit AS le1 JOIN lerneinheit AS le2  " +
        "ON le1.datum = le2.datum AND le1.pid = le2.pid " +
        " WHERE " +
        "  le1.datum BETWEEN  :dateMin AND :dateMax  AND " +
        "  le1.pid = :le1Pid AND " +
        "  (le1.abgesagtrechtzeitig = false OR  le1.nichtabgesagt = true OR le1.erschienen=true) AND " +
        "  (le2.abgesagtrechtzeitig = false OR  le2.nichtabgesagt = true OR le2.erschienen=true) AND " +
        "  le1.lernid!= le2.lernid AND " +
        "  (le2.beginn+1 BETWEEN le1.beginn AND le1.ende OR le2.ende-1 BETWEEN le1.beginn AND le1.ende) " +
        " ORDER BY le1.beginn");
query.setParametter("dateMin", "2016-10-20"); 
query.setParametter("dateMax", "2016-10-20"); 
query.setParametter("le1Pid", 3); 

【讨论】:

谢谢。我实际上使用 query.setParametter。但为了测试目的,我对其进行了硬编码。

以上是关于HSQLDB:遇到重复的 sql 别名的主要内容,如果未能解决你的问题,请参考以下文章

在 WHERE 子句 SQL 中使用别名 [重复]

在 OR 子句 SQL 中使用别名 [重复]

如何在 SQL 的 where 子句中使用别名 [重复]

在选择语句计算Oracle SQL中使用列别名[重复]

hsqldb 是不是支持 oracle 兼容模式下的表别名

GraphQL 列别名 [重复]