Java 使用CASE表达式的JOOQ排序
我使用JOOQ已经半年了,必须说它非常棒:) 我遇到的问题是:我试图生成普通SQL查询,其中包含Java 使用CASE表达式的JOOQ排序,java,mysql,sql,jooq,Java,Mysql,Sql,Jooq,我使用JOOQ已经半年了,必须说它非常棒:) 我遇到的问题是:我试图生成普通SQL查询,其中包含orderby子句和case。。。当语句实现自定义排序顺序时,如所述 但是,当我使用方法并传递Strings的Collection时,我在查询中得到以下orderby子句: order by case `type` when ? then ? when ? then ? when ? then ? when ? then ? when ? the
orderby
子句和case。。。当
语句实现自定义排序顺序时,如所述
但是,当我使用方法并传递String
s的Collection
时,我在查询中得到以下orderby
子句:
order by
case `type`
when ? then ?
when ? then ?
when ? then ?
when ? then ?
when ? then ? end asc
因为我没有使用JOOQ执行查询,所以我需要自己指定这些值,这很不方便
该问题的部分解决方案是使用方法传递从原始值获得的参数值的集合
。但是,在这种情况下,占位符仍然存在,并且查询中的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
这是预期的行为还是可以被视为bug并应报告
现在,我使用方法解决了这个问题,用递增的整数值将Map
传递给它。这个方法也有一个小问题,因为它返回的SortField
实例没有像asc()
、desc()
或sort(SortOrder)
这样的方法,所以为了以不同的顺序排序,应该重新生成这个映射
提前感谢您的帮助 要从查询中提取所有绑定值,请使用。排序间接值应该在其中。另见
注意,生成“内联”排序间接值而不是绑定值通常很有用,以防止将来出现这种情况。就执行计划而言,我认为不会有任何区别。我已经为此注册了。“这个方法也有一个小问题,因为它返回的SortField实例没有像asc()、desc()或sort(SortOrder)这样的方法,所以为了以不同的顺序排序,应该重新生成这个映射。”-嗯,返回一个SortField
,它有asc()
,desc()
方法。你是说打电话给他们可能没有效果?你能给我举个例子吗?根据JavadocSortField
是一个没有asc()
,desc()
或排序(SortOrder)
方法的接口。。。还是我遗漏了什么?嗯,我不知道Query.getBindValues()
-这提供了新的可能性:)谢谢你的回答,也谢谢你为我的请求注册了这个问题!