我使用的是Hibernate 5.6,希望将以下SQL顺序字符串附加到criteriaBuilder:
order by rmgtnav_path, rmgtnav_collection_type<>'PROFILE', rmgtnav_denotation asc
代码如下:
List<Order> orderStatements = new ArrayList();
orderStatements.add(cb.asc(root.get("rmgtnav_path")));
orderStatements.add(cb.asc(cb.notEqual(root.get("rmgtnav_collection_type"), "PROFILE")));
orderStatements.add(cb.asc(root.get("rmgtnav_denotation")));
criteriQuery.orderBy(orderStatements);
Query query = session.createQuery(cq);
当我调用session.createQuery(cq)
时,得到以下错误:
org.hibernate.hql.internal.ast.QuerySyntaxException:意外AST节点:第1行,第596列附近[从com.myapp.core.rmgt.rate.business.object.rmgtBVOImpl中选择生成的别名0作为生成的别名0,其中(生成的别名0.集合类型〈〉:参数0)和((生成的别名0.集合子类型〈〉:参数1)或(生成的别名0.集合子类型为空))和((较低的(生成的别名0.配置文件状态)类似于:参数2)和((生成的别名0.类型=:参数3)或(生成的别名0.类型=:参数4)))和(生成的别名0.启用=:参数5)和((生成的别名0.所有者=:参数6)或(生成的别名0.所有者=:参数7))按生成的别名0.路径升序,生成
生成的order by子句看起来和原生SQL语句没有什么不同,但是我得到了这个错误消息。知道如何将Order By中的〈〉比较转换为表达式吗?看起来Hibernate只是无法处理orderBy段中的这些类型的表达式。
如果是原因:这里我只能推测。子句〈〉'PROFILE'解析为true(1)或false(0)。如果值等于'PROFILE'则为False。由于0小于1,因此列表以'PROFILE'开头,后面是其余的。
语句本身是有效的sql:
SELECT rmgtnav_path, rmgtnav_denotation, rmgtnav_collection_type
FROM public.rmgt_t_navigation
order by rmgtnav_path , rmgtnav_collection_type, rmgtnav_denotation asc
鉴于:
SELECT rmgtnav_path, rmgtnav_denotation, rmgtnav_collection_type
FROM public.rmgt_t_navigation
order by rmgtnav_path , rmgtnav_collection_type <> 'PROFILE', rmgtnav_denotation asc
作为第二个问题,当我不需要asc标记时,有没有办法从生成的代码中删除它们,就像在原始sql中一样?
2条答案
按热度按时间23c0lvtd1#
使用常规SQL。更改:
至:
如果需要相反的顺序,请交换
0
和1
(或添加DESC
)。1l5u6lss2#
为此,您必须使用case表达式: