【问题标题】:How to select if a row exists in HQL如何选择 HQL 中是否存在行
【发布时间】:2011-06-20 22:54:26
【问题描述】:

编辑:专门讨论没有表的查询。是的,我可以使用存在,但我必须这样做

select case when exists (blah) then 1 else 0 end as conditionTrue
from ARealTableReturningMultipleRows

在 T-SQL 中我可以做到:

select case when exists(blah) then 1 else 0 end as conditionTrue

在 Oracle 中我可以做到:

select case when exists(blah) then 1 else 0 end as conditionTrue from DUAL

如何在 HQL 中实现相同的功能?

select count() 似乎是第二好的选择,但如果不需要,我不想处理表中的每一行。

【问题讨论】:

标签: sql hibernate hql


【解决方案1】:

简短回答:我认为这是不可能的。

我的推理:

根据Where can I find a list of all HQL keywords? Hibernate 项目并没有在他们的网站上发布 HQL 语法,不过它在 Hibernate 完整发行版中以.g ANTLR 文件的形式提供。

我对来自 ANTLR 的 .g 文件没有太多经验,但您可以在文件 (hibernate-distribution-3.6.1.Final/project/core/src/main/antlr/hql.g) 中找到它:

selectFrom!
        :  (s:selectClause)? (f:fromClause)? {                                                                                                    
                // If there was no FROM clause and this is a filter query, create a from clause.  Otherwise, throw                                
                // an exception because non-filter queries must have a FROM clause.                                                               
                if (#f == null) {                                                                                                                 
                        if (filter) {                                                                                                             
                                #f = #([FROM,"{filter-implied FROM}"]);                                                                           
                        }                                                                                                                         
                        else                                                                                                                      
                                throw new SemanticException("FROM expected (non-filter queries must contain a FROM clause)");                     
                }                                                                                                                                 

这清楚地表明有些 HQL 查询没有 FROM 子句,但如果这是一个过滤查询,这是可以接受的。再说一次,我不是 HQL/Hibernate 方面的专家,但我相信过滤查询不是完整的查询,而是您使用 session.createFilter 定义的东西(请参阅 How do I turn item ordering HQL into a filter query?),所以这让我认为没有办法省略FROM 子句。

【讨论】:

  • 这是一项很棒的研究,非常感谢!我暂时将其标记为已接受的答案,希望有一天您的答案不再正确。 =)
【解决方案2】:

我正在使用一排假表,例如 MyDual。

    select case when exists(blah) then 1 else 0 end as conditionTrue from MyDual

【讨论】:

    【解决方案3】:

    【讨论】:

    • 编辑了问题以更好地反映我的意思。很抱歉让您感到困惑。
    • 啊,我明白了,看起来与我多年前提出的一个没有答案的问题非常相似。如果你得到一个有效的,也许你会考虑将它添加到我的问题中。 stackoverflow.com/questions/808543/select-constant-in-hibernate
    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多