【问题标题】:jOOQ Query OrderBy as StringjOOQ 查询 OrderBy 作为字符串
【发布时间】:2019-12-21 17:29:28
【问题描述】:

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

例子

String orderByString = "NAME DESC, NUMBER ASC";

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

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

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

有没有办法将 order by 子句添加到查询中?

【问题讨论】:

    标签: jooq


    【解决方案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() 子句。

    【讨论】:

    • 太棒了!谢谢你。我实施了替代解决方案,但事实证明我必须支持按子句排序,例如“CASE WHEN NVL(GUELTIGBIS,SYSDATE)
    • 我明白了,那就行不通了。解析器可能最终会支持解析独立的排序规范,但现在还不支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2016-09-25
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多