JOOQ使用CASE表达式排序

时间:2014-03-20 15:12:29

标签: java mysql sql jooq

我现在使用 JOOQ 半年了,必须说它非常棒:)

我遇到的问题是:我尝试使用order by语句生成包含case ... when子句的纯SQL查询,以实现自定义排序顺序{{ 3}}

但是,当我使用in this part of JOOQ tutorial方法并传递Collection String时,我会在查询中获得以下order by子句:

order by 
    case `type` 
    when ? then ?
    when ? then ?
    when ? then ? 
    when ? then ? 
    when ? then ? end asc 

因为我没有使用 JOOQ 来执行查询,所以我需要自己指定这些值,这非常不方便。

此问题的部分解决方案是使用Field.sortAsc(Collection< T> sortList)方法传递从原始值获取的Collection Param<String>个值。但是,在这种情况下,占位符仍然存在,查询中的order by子句如下所示:

order by 
    case `type` 
    when 'type_a' then ?
    when 'type_b' then ?
    when 'type_c' then ? 
    when 'type_d' then ? 
    when null then ? end asc 

这种预期行为或者这可以被视为错误并且应该报告吗?

目前,我使用DSL.inline(T)方法解决了这个问题,并使用递增的整数值将Map<Param<String>, Param<Integer>>传递给它。此方法也存在一些小问题,因为它返回的SortField实例没有asc()desc()sort(SortOrder)这样的方法,所以为了排序如果订单不同,则应重新生成此地图。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

要从查询中提取所有绑定值,请使用Query.getBindValues()。排序间接值应该在那里。另请参阅relevant section of the manual

注意,生成&#34; inline&#34;通常很有用。排序间接值而不是绑定值以防止将来出现这种情况。执行计划方面,我不认为会有任何区别。我已为此注册了Issue #3147