【问题标题】:how to convert sql query to hibernate query如何将sql查询转换为休眠查询
【发布时间】:2019-05-13 07:08:20
【问题描述】:

我有 q sql 查询,我使用子查询和左连接获取数据。它在 sql server 上正常工作,但是当我在 hibernate 中使用 HQL 使用此查询时,它说意外令牌 (;

下面是我在 sql server 上运行良好的查询 -

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

【问题讨论】:

    标签: sql-server hibernate jpa


    【解决方案1】:

    以下是部分操作方法。

    首先,您的查询需要简化,因为联接根本没有效率。 MSSQL 不支持 FILTER,但Modern 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;
    

    其次,如果事实证明无法将其转换为 HQL,您可以使用 createNativeQuery,但这是我的尝试:

    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
    

    使用表别名很重要,这样它才能在查询中正确解析,即使它是唯一的表。

    【讨论】:

    • 非常感谢......现在我得到了运行良好的查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多