如何使用 jOOQ 的动态查询实现按字段值排序
How to implement order by field value with jOOQ's dynamic queries
我正在尝试在 jOOQ 中转换这样的东西:
select foo from bar
order by field(foo, 'value1', 'something-else', 'value3')
在 select 查询中,例如:
SelectQuery<Record> query = ...
query.addSelect(BAR.FOO);
query.addFrom(BAR);
query.addOrderBy( ... ? ... )
如何添加最后一位?
背景
我想要完成的基本上在这里描述:MySQL - ORDER BY values within IN()。在我的例子中,我有一个使用 'where field in(..)' 的通用批加载函数,我想保留顺序。这在我需要使用普通 SQL 时有效,但我需要将此位添加到使用 jOOQ 的动态构造的查询中。
这似乎可以解决问题。不知道有没有更好的答案,
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));
每当您达到 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") );
您可以使用类似的东西将以下 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()
我正在尝试在 jOOQ 中转换这样的东西:
select foo from bar
order by field(foo, 'value1', 'something-else', 'value3')
在 select 查询中,例如:
SelectQuery<Record> query = ...
query.addSelect(BAR.FOO);
query.addFrom(BAR);
query.addOrderBy( ... ? ... )
如何添加最后一位?
背景
我想要完成的基本上在这里描述:MySQL - ORDER BY values within IN()。在我的例子中,我有一个使用 'where field in(..)' 的通用批加载函数,我想保留顺序。这在我需要使用普通 SQL 时有效,但我需要将此位添加到使用 jOOQ 的动态构造的查询中。
这似乎可以解决问题。不知道有没有更好的答案,
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));
每当您达到 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") );
您可以使用类似的东西将以下 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()