【问题标题】:How to implement order by field value with jOOQ's dynamic queries如何使用 jOOQ 的动态查询实现按字段值排序
【发布时间】:2015-04-15 00:01:45
【问题描述】:

我正在尝试在 jOOQ 中转换类似的内容:

select foo from bar
order by field(foo, 'value1', 'something-else', 'value3')

在选择查询上,例如:

SelectQuery<Record> query = ...
query.addSelect(BAR.FOO);
query.addFrom(BAR);
query.addOrderBy( ... ? ... )

如何添加最后一位?


背景

我想要完成的基本上在这里描述:MySQL - ORDER BY values within IN()。就我而言,我有一个通用的批量加载函数,它使用“where field in(..)”,我想保留顺序。这适用于我需要它来使用普通 SQL,但我需要将此位添加到使用 jOOQ 动态构造的查询中。

【问题讨论】:

    标签: java mysql jooq


    【解决方案1】:

    这似乎可以解决问题。不知道有没有更好的答案,

    Field[] args = new Field[]{DSL.field("foo"), 
          DSL.val("value1"), DSL.val("something-else"), DSL.val("value3")}
    query.addOrderBy(DSL.function("field", SQLDataType.INTEGER, args));
    

    【讨论】:

    • 是的,DSL.functionDSL.field() 模板一样工作
    【解决方案2】:

    每当您达到 jOOQ 的限制时,请使用plain SQL。您可以像这样编写自己的字段函数:

    class MyDSL {
    
        public static Field<Integer> field(Field<String> search, String in1) {
            return field(search, DSL.val(in1));
        }
    
        public static Field<Integer> field(Field<String> search, Field<String> in1) {
            return DSL.field("field({0}, {1})", Integer.class, search, in1);
        }
    
        public static Field<Integer> field(Field<String> search, 
                                           String in1, 
                                           String in2) {
            return field(search, val(in1), val(in2));
        }
    
        public static Field<Integer> field(Field<String> search, 
                                           Field<String> in1, 
                                           Field<String> in2) {
            return DSL.field("field({0}, {1}, {2})", Integer.class, search, in1, in2);
        }
    
        // ... or, support a varargs function variant, too
    }
    

    现在在你的所有陈述中使用它:

    query.addOrderBy( MyDSL.field(BAR.FOO, "value1", "something-else", "value3") );
    

    【讨论】:

      【解决方案3】:

      您可以使用类似的方法将以下 sql 转换为 jooq。这里'sortAsc'用于根据给定的值顺序进行排序。

      SQL

      select foo from bar order by field(foo, 'value1', 'something-else', 'value3')
      

      JOOQ

      DSL()
      .select(BAR.FOO)
      .from(BAR)
      .orderBy(BAR.FOO.sortAsc('value11', 'something-else', 'value3'))
      .fetch()
      

      【讨论】:

        猜你喜欢
        • 2011-08-12
        • 2018-03-25
        • 2013-02-27
        • 2020-08-14
        • 1970-01-01
        • 2010-09-28
        • 2022-08-19
        • 2015-08-21
        • 2015-12-20
        相关资源
        最近更新 更多