如何选择HQL中是否存在行

时间:2011-02-03 20:32:07

标签: sql hibernate hql

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

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()似乎是第二好的选择,但如果我不需要,我不想处理表中的每一行。

3 个答案:

答案 0 :(得分: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子句的方法。

答案 1 :(得分:1)

我使用一行假表,例如MyDual。

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

答案 2 :(得分:0)