簡體   English   中英

我可以在 JOOQ select 字段中使用自定義記錄映射器嗎?

[英]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.

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