简体   繁体   中英

JOOQ Ordering using CASE expressions

I'm using JOOQ for half a year now and must say that it's quite superb :)

The problem I encountered is: I'm trying to generate plain SQL query containing order by clause with case ... when statements to achieve custom sorting order as described in this part of JOOQ tutorial .

However, when I'm using Field.sortAsc(Collection< T> sortList) method and passing Collection of String s I get following order by clause in query:

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

Because I'm not using JOOQ for executing queries, I need to specify these values myself which is quite inconvenient.

Partial solution to this problem was to pass Collection of Param<String> values obtained from original values using DSL.inline(T) method. However, in that case placeholders still exist and order by clause in query looks like:

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 

Is this expected behaviour or this can be considered as bug and should be reported?

For now, I worked this problem around by using Field.sort(Map sortMap) method, passing Map<Param<String>, Param<Integer>> to it with incremented integer values. There is minor problem with this method as well, because it returns SortField instance which doesn't have methods like asc() , desc() or sort(SortOrder) so in order to sort with different orders this map should be regenerated.

Thanks in advance for any help!

In order to extract all bind values from a query, use Query.getBindValues() . The sort indirection values should be in there. See also the relevant section of the manual .

Note, it might be generally useful to generate "inline" sort indirection values instead of bind values to prevent this in the future. Execution-plan-wise, I don't think there will be any difference. I have registered Issue #3147 for this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM