[英]JOOQ Ordering using CASE expressions
我使用JOOQ已有半年了,必須說它非常出色:)
我遇到的問題是:我正在嘗試生成普通SQL查詢,其中包含帶case ... when
order by
子句case ... when
語句以實現自定義排序順序,如JOOQ教程的本部分所述。
但是,當我使用Field.sortAsc(Collection <T> sortList)方法並傳遞String
的Collection
,在查詢中得到以下order by
子句:
order by
case `type`
when ? then ?
when ? then ?
when ? then ?
when ? then ?
when ? then ? end asc
因為我沒有使用JOOQ來執行查詢,所以我需要自己指定這些值,這很不方便。
此問題的部分解決方案是使用DSL.inline(T)方法傳遞從原始值獲得的Param<String>
值的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<Param<String>, Param<Integer>>
傳遞給它。 這個方法也有一個小問題,因為它返回的SortField
實例沒有asc()
, desc()
或sort(SortOrder)
因此為了以不同的順序進行排序,應重新生成此映射。
在此先感謝您的幫助!
為了從查詢中提取所有綁定值,請使用Query.getBindValues()
。 排序間接值應該在其中。 另請參見手冊的相關部分 。
請注意,通常可能會生成“內聯”排序間接值而不是綁定值,以防止將來發生這種情況。 就執行計划而言,我認為不會有任何區別。 我已經為此注冊了問題3147 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.