Как выбрать, если в HQL существует строка - PullRequest
6 голосов
/ 03 февраля 2011

РЕДАКТИРОВАТЬ: конкретно говорить о запросах без таблицы. Да, я могу использовать существует, но я должен сделать

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 ]

1 голос
/ 20 февраля 2011

Краткий ответ: я считаю, что это НЕ возможно.

Мои рассуждения:

Согласно Где я могу найти список всех ключевых слов HQL? Проект Hibernate не публикует грамматику HQL на своем веб-сайте, однако он доступен в полном дистрибутиве Hibernate как файл .g ANTLR.

У меня нет большого опыта работы с .g файлами из ANTLR, но вы можете найти это в файле (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 (см. Как превратить упорядочивание элементов HQL в запрос фильтра? ), поэтому я думаю, что нет способа опустить предложение FROM.

1 голос
/ 14 июня 2013

Я использую поддельную таблицу с одной строкой, например, MyDual.

    select case when exists(blah) then 1 else 0 end as conditionTrue from MyDual
0 голосов
/ 03 февраля 2011

Согласно http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-expressions похоже, что они поддерживают операторы case и существующие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...