【问题标题】:JOOQ Ordering using CASE expressions使用 CASE 表达式的 JOOQ 排序
【发布时间】:2014-04-27 13:15:26
【问题描述】:

JOOQ用了半年了,不得不说非常棒:)

我遇到的问题是:我正在尝试生成包含order by 子句和case ... when 语句的普通SQL 查询,以实现in this part of JOOQ tutorial 所述的自定义排序顺序。

但是,当我使用Field.sortAsc(Collection< T> sortList) 方法并传递Strings 的Collection 时,我在查询中得到以下order by 子句:

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

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

此问题的部分解决方案是通过使用DSL.inline(T) 方法从原始值获得的Param&lt;String&gt; 值中的Collection。但是,在这种情况下,占位符仍然存在,查询中的 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 

这是预期行为还是可以被视为错误并应报告?

目前,我通过使用Field.sort(Map sortMap) 方法解决了这个问题,将Map&lt;Param&lt;String&gt;, Param&lt;Integer&gt;&gt; 传递给它并使用递增的整数值。这个方法也有一个小问题,因为它返回 SortField 实例,它没有像 asc()desc()sort(SortOrder) 这样的方法,所以为了按不同的顺序排序,应该重新生成这个映射。

提前感谢您的帮助!

【问题讨论】:

  • "这个方法也有小问题,因为它返回的 SortField 实例没有 asc()、desc() 或 sort(SortOrder) 等方法,所以为了使用不同的顺序排序,应该重新生成此地图。” - 嗯,Field.sort(Map) 返回一个 SortField,它有 asc()desc() 方法。你的意思是打电话给他们没有效果,也许吧?你能举个例子吗?
  • 根据 Javadoc jooq.org/javadoc/3.3.x/org/jooq/SortField.html SortField 是一个没有 asc()desc()sort(SortOrder) 方法的接口......或者我错过了什么?

标签: java mysql sql jooq


【解决方案1】:

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

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

【讨论】:

  • 嗯,不知道Query.getBindValues() - 这提供了新的可能性:) 感谢您的回答并为我的请求注册问题!
猜你喜欢
  • 2019-05-05
  • 2018-04-04
  • 2021-12-08
  • 2020-10-21
  • 2015-02-19
  • 1970-01-01
  • 2020-08-06
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多