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