jooq 按语句顺序使用自定义函数

jooq use custom function in order by statement

我目前正在尝试将此函数 引入我的项目,但遇到了 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
)

但是其中 none 似乎符合我按名称订购 table 的用例。

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

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 语句中的正确方法是什么?

如您在生成方法的签名中所见:

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();