【问题标题】:jooq use custom function in order by statementjooq 按语句顺序使用自定义函数
【发布时间】:2021-07-26 08:45:22
【问题描述】:

我目前正在尝试将这个函数 https://stackoverflow.com/a/12257917/4375998 引入我的项目中,但遇到了 jooq 生成的函数签名。

生成的代码有这三个签名

public static String udfNaturalsortformat(
      Configuration configuration
    , String instring
    , Integer numberlength
    , String sameorderchars
)

public static Field<String> udfNaturalsortformat(
      String instring
    , Integer numberlength
    , String sameorderchars
)

public static Field<String> udfNaturalsortformat(
      Field<String> instring
    , Field<Integer> numberlength
    , Field<String> sameorderchars
)

但它们似乎都不适合我按名称排序表的用例。

目前以以下方式完成:在某些地方生成搜索参数集合,然后将其包含在查询中:

public Collection<? extends SortField<?>> getSortFields(List<Pageable.SortField> sorts) {
        if (sorts.isEmpty()) {
            return Collections.singletonList(ProjectRepositoryImpl.LAST_ACTIVITY.field("last_activity").desc());
        }
        List<SortField<?>> sortFields = new ArrayList<>();
        for (Pageable.SortField sort : sorts) {
            if (sort.getSortDirection() == Pageable.SortDirection.DESC) {
                sortFields.add(PROJECT.NAME.desc());
            } else {
                sortFields.add(PROJECT.NAME.asc());
            }
        }

        return sortFields;
}

最后的查询看起来像这样

        Result<Record> queryResults = jooq.select(PROJECT.fields())
                .from(PROJECT)
                .where(searchCondition)
                .orderBy(transformer.getSortFields(pageable.getSorts()))
                .limit(pageable.getPageSize())
                .offset(pageable.getOffset())
                .fetch();

所以我目前尝试做的是将排序字段替换为类似的内容

    sortFields.add(udfNaturalsortformat(PROJECT.NAME, 10, ".").desc());

但签名不匹配。

在我的 order by 语句中包含此方法的正确方法是什么?

【问题讨论】:

    标签: java mysql jooq


    【解决方案1】:

    正如您在生成的方法的签名中看到的那样:

    public static Field<String> udfNaturalsortformat(
          String instring
        , Integer numberlength
        , String sameorderchars
    )
    
    public static Field<String> udfNaturalsortformat(
          Field<String> instring
        , Field<Integer> numberlength
        , Field<String> sameorderchars
    )
    

    它只覆盖所有 java 简单对象(第一个)或 Field> 引用(第二个)。

    由于您使用PROJECT.NAME 作为第一个参数,您可能会使用第二个生成的方法,但是您必须传递所有 Field> 类型的其他参数。所以试试 DSL.val 或 DSL.inline,这是一种将常量值作为字段传递的方法:

    udfNaturalsortformat(Staff.STAFF.ACQUIRED_COMPANY, DSL.val(10), DSL.val(".")).desc();
    

    【讨论】:

    • 感谢您对静态 DSL.val() 的提示。
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 2019-12-16
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多