Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HQL按条件排序_Java_Sql_Hibernate - Fatal编程技术网

Java HQL按条件排序

Java HQL按条件排序,java,sql,hibernate,Java,Sql,Hibernate,我遇到了一个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 "ma

我遇到了一个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)
我遇到了如下例外情况:

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

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

from Products as p where p.balance < p.bottleneck order by p.bottlenec desc, p.productCode asc
这是一种更标准的编写SQL的方法,因为您在where子句之后添加了order

编辑:

似乎没有一种方法可以满足您的需求,至少不使用HQL。Postgres拥有比HQL更强大的ORDERBY子句

Postgres具有ORDER BY expression,其中expression具有

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

交易杀手是这样一句话:

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


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

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

balance <= b 

零件应在何处关闭。在HQL中,您不能应用Postgre SQL特定的语法。

谢谢您的回复,这不是我想要的结果。您的方式是工作,但结果仅显示为余额小于瓶颈的记录。我希望我能得到所有的结果,并按优先级排序,其余的按产品代码排序。哦,我明白了。。。无论如何,谢谢你的解释。也许我会尝试使用Java comparator来进行排序。你能解释一下按余额排序得到所有结果并按第一优先级的余额<瓶颈排序,其余的是按产品代码排序。但按余额<瓶颈排序的结果意味着什么吗?@mattb的意思是,余额小于瓶颈的记录将首先排序,然后是按产品代码排序的记录。