我遇到了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
答案 0 :(得分: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子句。
Postgres documentation on select clause有“ORDER BY 表达式 ”,其中表达式为it's own documentation page。
另一方面,Hibernate的order by clause非常有限。它允许您订购列并使用常规或聚合函数。
交易杀手是这句话:
group by子句和order by子句都不能包含 算术表达式。
因此,您似乎运气不好,如果您想获得所需的结果集,则必须使用本机SQL。
答案 1 :(得分:0)
我对PostgreSQL语法不是很熟悉,但是
balance <= b
部分应该在哪里关闭。在HQL中,您无法应用Postgresql特定的语法。