JOOQ 解析 orderBy 和 orderDirection 以与 dslcontext 一起使用

Posted

技术标签:

【中文标题】JOOQ 解析 orderBy 和 orderDirection 以与 dslcontext 一起使用【英文标题】:JOOQ parsing orderBy and orderDirection to use with dslcontext 【发布时间】:2019-01-14 14:38:28 【问题描述】:

我正在从我的控制器获取 orderBy 和 orderDirection,并希望对其进行解析并将其与我使用 DSLContext 进行查询的存储库一起使用。

这是我的方法:

public List<Map<String, Object>> read(@NonNull final String schema,
                                      @NonNull final String tableName,
                                      @NonNull final List<String> columnNames,
                                      @NonNull final String queryConditions,
                                      @NonNull final String orderBy,
                                      @NonNull final String orderDirection) 
    final Table table = table(getTableWithSchema(schema, tableName));
    final List<Condition> conditions = conditionMapper.mapToConditions(queryConditions);
    final List<Field<?>> fields = fieldsMapper.mapToFields(columnNames);
    final SortField sortField = ???

    return crudRepository.read(table, fields, conditions, sortField);

后来我的crud将其称为:

public List<Map<String, Object>> read(@NonNull final Table<?> table,
                                      @NonNull final Collection<Field<?>> fields,
                                      @NonNull final Collection<Condition> conditions,
                                      @NonNull final SortField<?> sortField) 
    return dslContext
            .select(fields)
            .from(table)
            .where(conditions)
            .orderBy(sortField)
            .fetchMaps();

我将如何创建该 sortField(只有一个)以便将其传递给 dslContext?

【问题讨论】:

只是为了确定,因为您正在使用String 类型(并且因为我很偏执):您的控制器不会将用户输入传递给您的read() 方法,对吗?跨度> 不,它是一个仅供管理员使用的内部工具 - 它由另一个验证参数等的 API 使用 正如我所说,我很偏执。如果 String 值来自您的逻辑之外(通过 API、UI 无关紧要),那么您在这里暴露了 SQL 注入漏洞。我强烈建议您自己清理您的输入,而不是依赖“另一个 API”。 【参考方案1】:

我自己找到的 - JOOQ 初学者在这里,所以也许它会帮助别人。

SortField<?> sortField = DSL.field(orderBy).sort(SortOrder.valueOf(orderDirection));

【讨论】:

以上是关于JOOQ 解析 orderBy 和 orderDirection 以与 dslcontext 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

无法解析 jOOQ 生成的类 TableOptions

JOOQ:如何将外键解析为对象?

使用 Gradle Kotlin DSL 配置 Jooq 时如何修复“未解析的引用:jdbc”

JOOQ 解析器问题(POSTGRES 到 H2 的翻译)

使用 DDL 数据库生成代码时找不到函数 - jooq

使用 Jooq 在数值基础上按 varchar 字段(具有数值)对查询进行排序