jOOQ 查询顺序为字符串



>我从应用程序配置中以字符串形式获取 order by 子句。

String orderByString = "NAME DESC, NUMBER ASC";

现在我想在jOOQ查询中使用此顺序:

Result<KampagneRecord> records = repository.dsl()
.selectFrom(KAMPAGNE)
.orderBy(orderByString)
.fetch();

不幸的是,orderBy 不接受字符串。

有没有办法将顺序依据子句添加到查询中?

你可以利用jOOQ不验证你的普通SQL模板的事实,只需将你的字符串包装在一个DSL.field(String)中:

Result<KampagneRecord> records = repository.dsl()
.selectFrom(KAMPAGNE)
.orderBy(field(orderByString))
.fetch();

当然,您必须确保语法正确性得到保证,并防止SQL注入。

一些依赖于 jOOQ 能够转换 SQL 的ORDER BY子句的边缘情况可能会停止工作,但在您的简单查询示例中,这不适用。

在非常简单的情况下,另一种解决方案是预处理字符串。似乎这行得通:

String orderByString = "NAME DESC, NUMBER ASC";
List<SortField<?>> list =
Stream.of(orderByString.split(","))
.map(String::trim)
.map(s -> s.split(" +"))
.map(s -> {
Field<?> field = field(s[0]);
return s.length == 1
? field.sortDefault()
: field.sort("DESC".equalsIgnoreCase(s[1])
? SortOrder.DESC
: SortOrder.ASC
);
})
.collect(Collectors.toList());
System.out.println(list);

现在可以将此列表传递给orderBy()子句。

最新更新