【问题标题】:QuerySyntaxException when using SQL EXCEPT and count(*)使用 SQL EXCEPT 和 count(*) 时出现 QuerySyntaxException
【发布时间】:2014-03-28 15:01:52
【问题描述】:

我在 Hibernate 中遇到了一种情况,我需要在 SQL EXCEPT 查询中获取 count(*)。下面是查询(模仿我原来的代码):

String query = """ 
               select count(*) as totalCount 
               from ( select distinct id from Employee 
                      where name like '%Roger% 
                      EXCEPT select distinct id from Manager ) Temporary
               """

现在,当我说:

hibernateSession.createQuery(query);

抛出以下异常:

org.hibernate.hql.ast.QuerySyntaxException: 
                    unexpected token: ( near line 1, column 36

当我发现异常时,我的日志还会显示以下解析错误:

org.hibernate.hql.PARSER    line 1:36: unexpected token: (
org.hibernate.hql.PARSER    line 14:315: unexpected token: EXCEPT
org.hibernate.hql.PARSER    line 15:68: unexpected token: from

我无法避免计数,WHERE 或 EXCEPT。

【问题讨论】:

    标签: sql hibernate grails spring-data


    【解决方案1】:

    因为您使用的是hibernateSession.createQuery(query),所以 hibernate 正在使用 HQL 语法创建一个查询,这不适用于您的查询,因为您使用的是 SQL 语法。

    您很可能需要使用类似于hibernateSession.createSQLQuery(query) 的东西。

    有关使用本机 sql 查询的更多信息,请参阅 Hibernate 文档中的 Native SQL

    related question 的答案也可能有用。

    【讨论】:

    • 谢谢。我想尝试 createSQLQuery()。但是,在继续之前我可以假设几件事: 1. 我可以假设我粘贴的查询的语法没有任何问题吗? 2. 我的理解(可能是错误的)是当查询输入是原生SQL语法时使用createSQLQuery。但在我的查询中,我使用的是域名和属性名称,而不是 SQL 表和列名。使用 createSQLQuery 是否仍然可以。
    • 对不起,没有。我想我没看到。我认为如果你这样做,你将不得不使用表名和列名。它必须是 SQL。
    • 那很糟糕 :( 我真的不想写原生 SQL。看来我必须想个办法。谢谢 Don。
    • 您可以将 EXCEPT 子句替换为 NOT EXISTS 子句,这在 HQL 中有效。不确定子选择。我实际上并没有那么多地使用 HQL。使用条件,您可以混合 SQL 限制。
    【解决方案2】:

    你可以试试这个查询吗?将 EXCEPT 替换为 NOT EXISTS。

    String query = """ 
               select count(*) as totalCount 
               from ( select distinct id from Employee as emp
                      where emp.name like '%Roger% 
                      and not exists ( 
                          from Manager as m where emp.id = m.id
                      ) 
                    ) Temporary
               """
    

    【讨论】:

    • 我尝试了您的建议。但他们没有工作。三元组 " 和 NOT EXISTS 都不存在。此外,我认为 NOT EXISTS 不适合我的要求,因为它与 EXCEPT 不同。不过,我确实尝试过,因为我需要查询才能工作,但徒劳无功。请让我知道您是否还有其他想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多