如何使用jOOQ的动态查询按字段值实现排序

时间:2015-02-13 20:25:24

标签: java mysql jooq

我试图在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字段,我想保留顺序。这是因为我需要使用纯SQL,但是我需要将此位添加到使用jOOQ的动态构造的查询中。

3 个答案:

答案 0 :(得分:3)

每当你达到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") );

答案 1 :(得分:2)

这似乎可以解决问题。不确定是否有更好的答案,

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));

答案 2 :(得分:1)

您可以使用类似的方法将以下 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()