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