jooq - jOOQ 查询 OrderBy 作为字符串
问题描述
我从应用程序配置中获取 order by 子句作为字符串。
例子
String orderByString = "NAME DESC, NUMBER ASC";
现在我想在 jOOQ 查询中使用这个顺序:
Result<KampagneRecord> records = repository.dsl()
.selectFrom(KAMPAGNE)
.orderBy(orderByString)
.fetch();
不幸的是 orderBy 不接受字符串。
有没有办法将 order by 子句添加到查询中?
解决方案
您可以使用 jOOQ 不验证您的纯 SQL 模板这一事实,而只需将您的字符串包装在DSL.field(String)
:
Result<KampagneRecord> records = repository.dsl()
.selectFrom(KAMPAGNE)
.orderBy(field(orderByString))
.fetch();
当然,您必须确保语法正确,并防止 SQL 注入。
一些依赖 jOOQ 能够转换 SQLORDER 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()
子句。
推荐阅读
- amazon-web-services - aws new VPC 或路由表是否需要任何费用?
- html - CSS/Shopify 样式
- timestamp - 如何查询和绘制单次测量之间的时间差?
- python - Python 无法正确将屏幕截图发送到电子邮件
- javascript - 如何使用视频路径播放 HTML5 中的本地视频
- mysql - 根据 user_id 从 Deals_public 表中获取最新记录
- javascript - 如何扩展此 javascript/html 或正确编写它?
- windows - 作为 Windows Docker 桌面的一部分运行的 Kubernetes 集群是否有等效的 host.docker.internal
- database - Laravel:从数据库中检索模型
- laravel - 无法在 Laravel 中更新可翻译模型