jpa “order by”子句中的〈>导致createQuery失败

u4vypkhs  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(203)

我使用的是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中一样?

23c0lvtd

23c0lvtd1#

使用常规SQL。更改:

rmgtnav_collection_type<>'PROFILE'

至:

case when rmgtnav_collection_type = 'PROFILE' then 0 else 1 end

如果需要相反的顺序,请交换01(或添加DESC)。

1l5u6lss

1l5u6lss2#

为此,您必须使用case表达式:

orderStatements.add(
    cb.asc(
        cb.selectCase()
            .when(
                cb.notEqual(root.get("rmgtnav_collection_type"), "PROFILE"),
                cb.literal(0)
            )
            .otherwise(cb.literal(1))
    )
);

相关问题