我正在从应用程序配置中以字符串形式获取order by子句。
示例
String orderByString = "NAME DESC, NUMBER ASC";
现在我要在jOOQ查询中使用此顺序:
Result<KampagneRecord> records = repository.dsl()
.selectFrom(KAMPAGNE)
.orderBy(orderByString)
.fetch();
很不幸,orderBy不接受字符串。
是否可以将order by子句添加到查询中?
答案 0 :(得分:1)
您可以使用jOOQ不会验证您的plain SQL templating的事实,而只是将您的字符串包装在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()
子句。