[英]Can I use a custom recordmapper in JOOQ select field already?
假設我有一個自定義 RecordMapper 由於任何原因:
public class UserGroupMapper implements RecordMapper<Record, UserGroup> {
@Override
public UserGroup map(Record rec) {
UserGroup grp = new UserGroup(rec.getValue(USER_GROUP.ID),
rec.getValue(USER_GROUP.NAME),
rec.getValue(USER_GROUP.DESCRIPTION)
javaParseTags(USER_GROUP.TAGS)
);
}
在 JOOQ 中,我可以這樣使用它:
ctx.select()
.from(USER_GROUP)
.fetch(new UserGroupMapper());
但是,如果我想 select 多件事(比如來自左連接的數據),那么在最后一步(獲取步驟)中不使用 RecordMapper 會很方便,但已經在select
步驟中使用,因為我在這里看到了一個例子POJO,而不是 RecordMappers: ctx.select(row(A, B, C).mapping(MyPojo::new), otherFieldsLikeMultiSet)
我的問題:普通的 RecordMappers 也有類似的語法嗎? mapping
function 需要一個 FunctionN<AllMyFields..., ?> 而不是像 RecordMapper 實現的 Function<Record, ?> 之類的東西。
所以一些代碼有點像這樣:
UserGroupMapper mapper = new UserGroupMapper(); //Implements RecordMapper
var res = ctx.select(
row(
USER_GROUP.ID,
USER_GROUP.NAME,
USER_GROUP.DESCRIPTION,
USER_GROUP.TAGS
).mapToMyPojo(mapper), // this function doesn't exist. How to utilize my mapper here?
USER_GROUP.JSONLOAD
)
.from(USER_GROUP)
.fetch();
現在,我想要一個Result<Record2<UserGroup,String>>
。 因此,我不想在獲取階段“最終”使用記錄映射器,而是更早地應用記錄映射器。 我知道向 object mapping
行提供 FunctionN 是可能的,但遺憾的是我的 RecordMapper 不是FunctionN
:)
Row4.mapping(Function4)
只是臨時轉換方法的語法糖,例如SelectField.convertFrom
。
現在, Row4<T1, T2, T3, T4>
擴展SelectField<Record4<T1, T2, T3, T4>>
,因此您可以傳遞任何? super Record4<T1, T2, T3, T4>
? super Record4<T1, T2, T3, T4>
類型到convertFrom(...)
方法。 您的RecordMapper<Record, UserGroup>
擴展了Function<Record, UserGroup>
,因此您可以直接傳遞它:
使用 jOOQ 3.17
Field<UserGroup> field = row(...).convertFrom(new UserGroupMapper());
使用 jOOQ 3.16
上面的SelectField::convertFrom
方法僅在 jOOQ 3.17 中從Field
中提取,請參見#13118 。 在此之前,您可以使用DSL.field(SelectField)
將row()
表達式轉換為Field
:
Field<UserGroup> field = field(row(...)).convertFrom(new UserGroupMapper());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.