我现在使用 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)
这样的方法,所以为了排序如果订单不同,则应重新生成此地图。
提前感谢您的帮助!
答案 0 :(得分:1)
要从查询中提取所有绑定值,请使用Query.getBindValues()
。排序间接值应该在那里。另请参阅relevant section of the manual。
注意,生成&#34; inline&#34;通常很有用。排序间接值而不是绑定值以防止将来出现这种情况。执行计划方面,我不认为会有任何区别。我已为此注册了Issue #3147。