首页 > 解决方案 > 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

解决方案


您可以使用 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()子句。


推荐阅读