簡體   English   中英

使用CASE表達式進行JOOQ排序

[英]JOOQ Ordering using CASE expressions

我使用JOOQ已有半年了,必須說它非常出色:)

我遇到的問題是:我正在嘗試生成普通SQL查詢,其中包含帶case ... when order by子句case ... when語句以實現自定義排序順序,如JOOQ教程的本部分所述。

但是,當我使用Field.sortAsc(Collection <T> sortList)方法並傳遞StringCollection ,在查詢中得到以下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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM