jOOQ查询OrderBy作为字符串

时间:2019-08-15 08:26:12

标签: jooq

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

示例

String orderByString = "NAME DESC, NUMBER ASC";

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

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

很不幸,orderBy不接受字符串。

是否可以将order by子句添加到查询中?

1 个答案:

答案 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()子句。