Как преобразовать SQL-запрос в Hibernate запрос - PullRequest
0 голосов
/ 13 мая 2019

У меня есть 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

1 Ответ

0 голосов
/ 13 мая 2019

Вот частично, как это сделать.

Во-первых, ваш запрос должен быть упрощен, потому что объединения совсем не эффективны. 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

Важно использовать псевдоним таблицы, чтобы он правильно разрешался в запросе, даже если это единственная таблица.

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