簡體   English   中英

jooq 按語句順序使用自定義 function

[英]jooq use custom function in order by statement

我目前正在嘗試將此 function https://stackoverflow.com/a/12257917/4375998引入我的項目,但與 ZC1C4252684E68385D1AB4Aq7 生成的簽名斗爭。

生成的代碼有這三個簽名

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 語句中包含此方法的正確方法是什么?

正如您在生成的方法的簽名中看到的那樣:

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作為第一個參數,您可能會使用第二個生成的方法,但是您必須傳遞其他 arguments 所有 Field<?> 類型。 所以試試 DSL.val 或 DSL.inline,這是一種將常量值作為字段傳遞的方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM