У меня есть q sql-запрос, в котором я извлекаю данные, используя подзапрос и левое соединение. он работает правильно на сервере sql, но когда я использую этот запрос в спящем режиме с использованием HQL, он говорит неожиданный токен (;
ниже мой запрос, который отлично работает на сервере sql -
SELECT IH.vendorName, IH.C, IHP.CP FROM (SELECT vendorName, count(*) as C
FROM InvoiceHeader GROUP BY vendorName) IH LEFT JOIN (SELECT vendorName,
count(*) AS CP FROM InvoiceHeader WHERE invoiceStatus='Processed' GROUP BY
vendorName) IHP ON IHP.vendorName=IH.vendorName ORDER BY IH.C DESC
здесь я пытаюсь преобразовать свой sql-запрос в HQL
Query q = sessionFactory.getCurrentSession().createQuery("SELECT
IH.vendorName, IH.C, IHP.CP FROM (SELECT vendorName, count(*) as C FROM
InvoiceHeader GROUP BY vendorName) IH LEFT JOIN (SELECT vendorName, count(*)
AS CP FROM InvoiceHeader WHERE invoiceStatus='Processed' GROUP BY
vendorName) IHP ON IHP.vendorName=IH.vendorName ORDER BY IH.C DESC");
но я получаю эту ошибку в
org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR: line 1:41: unexpected token: (
org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR: line 1:61: unexpected token: count





Вот частично, как это сделать.
Во-первых, ваш запрос нужно упростить, потому что соединения совсем не эффективны. MSSQL не поддерживает FILTER, но Современный SQL показывает нам достаточную альтернативу.
SELECT vendorName, sum(case when invoiceStatus = 'Processed' then 1 end) as CP, count(*) as C FROM InvoiceHeader GROUP BY vendorName ORDER BY C DESC;
Во-вторых, вы могли бы использовать createNativeQuery, если окажется, что это невозможно перевести на HQL, но это моя попытка сделать это:
SELECT I.vendorName, COUNT(I) as C, SUM(CASE WHEN I.invoiceStatus = 'Processed' THEN 1 END) AS CP FROM InvoiceHeader I GROUP BY I.vendorName ORDER BY C DESC
Важно использовать псевдоним таблицы, чтобы он правильно разрешался в запросе, даже если это единственная таблица.
большое спасибо .. теперь я получил запрос, который работает нормально