1

我遇到了一个 SQL 问题。

假设这是我的原生 SQL:

SELECT * FROM products 
ORDER BY balance <= bottleneck DESC, product_code ASC

这是在 postgressql 工作的。但它不适用于 HQL。我的 HQL 如下:

from Products as p order by  p.balance < p.bottleneck desc, p.productCode asc

我遇到了以下异常:

Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: < near line 1, column 67 [from com.inventory.inventory.vo.Products as p order by  p.balance < p.bottleneck]
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
    at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
    at com.inventory.inventory.dao.impl.ProductsDAOImpl.getProducts(ProductsDAOImpl.java:72)
    at Main.main(Main.java:43)

有什么办法可以解决这个查询吗?

非常感谢您的帮助。

谢谢,最好的 rgds,A1ucard

4

2 回答 2

0

我现在还没有安装 Hibernate,但这应该可以:

from Products as p where p.balance < p.bottleneck order by p.bottlenec desc, p.productCode asc

这是一种更“标准”的 SQL 编写方式,因为您在 where 子句之后放置了顺序。

编辑:

似乎没有办法做你想做的事,至少不使用 HQL。Postgres 有一个比 HQL 更强大的 ORDER BY 子句。

关于 select 子句的Postgres文档有“ORDER BY表达式”,其中表达式有它自己的文档页面

另一方面,Hibernate 的order by 子句非常有限。它允许您对列进行排序并使用常规或聚合函数。

交易杀手是这句话:

group by 子句和 order by 子句都不能包含算术表达式。

因此,您似乎不走运,如果您想获得所需的结果集,则必须使用本机 SQL。

于 2012-09-14T13:34:06.177 回答
0

我对 PostreSQL 语法不是很熟悉,但是

balance <= b 

部分应该在靠近的地方。在 HQL 中,您不能应用 Postgre SQL 特定的语法。

于 2012-09-14T13:36:12.117 回答