Может ли HQL выбрать в результирующем наборе другого запроса?

Может ли HQL выбрать в результирующем наборе другого запроса?
Например:

SELECT COUNT(*) FROM (SELECT * FROM Table)


Я могу сделать это в SQL, но когда я пробовал, как указано выше, в HQL, но он просто показывает мне синтаксическую ошибку "неожиданный токен: (около строки 1, столбец 22..."

Ответы

Ответ 1

HQL поддерживает subqueries, однако они могут встречаться только в предложении select или where. Пример, который вы предоставляете, лучше всего написать в прямом выражении в HQL. Например:

select count(*) from table t  (where table is the entity name)

Если запрос включает более сложный оператор, чем (select * from Table), я бы рекомендовал включить эту логику в представление, а затем создать сущность, основанную на этом представлении.

Для баз данных, которые поддерживают подзапросы, Hibernate поддерживает подзапросы в запросах. Подзапрос должен быть окружен круглыми скобками (часто вызов функции агрегации SQL). Даже коррелированные подзапросы (подзапросы, которые ссылаются на псевдоним во внешнем запросе).

Пример

from DomesticCat as cat
where cat.name not in (
    select name.nickName from Name as name
)

Ответ 2

Использование подзапроса по вашему желанию невозможно. Один из способов заключается в следующем:

SELECT COUNT(DISTINCT t.id) FROM table t INNER JOIN t.list l
     WHERE t.status = 'ST1' AND l.status = 'ST2'"

Я использовал внутреннее соединение, чтобы выразить повторение выбора

Ответ 3

нет способа сделать подзапрос from предложения в HQL, даже если база данных поддерживает его, я решил эту проблему, поместив запрос в sql в качестве store procedure, а затем вызовите процедуру в HQL. Например:

Вставьте процедуру в свой sql:

DELIMITER $$
CREATE PROCEDURE 'procedure_name'(
  'arg_name' INT,
) BEGIN
     your query here
END;
$$
DELIMITER ;

Затем, если вы используете спящий режим, вызовите эту процедуру из java-кода, как показано ниже:

Query query = session.createSQLQuery("CALL procedure_name(:arg_name)");
query.setParameter("arg_name", args);
List list = query.list();

Надеюсь, это может вам помочь.

Ответ 4

В итоге я создал представление для своего запроса, а затем создал объект модели для этого. Тогда было легко создавать HQL-запросы для него.

Мое приложение не имеет некоторых требований к производительности, которые могут предъявлять другие, так что я могу с этим справиться.