Suppose I have a custom RecordMapper due to whatever reaons:
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)
);
}
In JOOQ, I could use it like so:
ctx.select()
.from(USER_GROUP)
.fetch(new UserGroupMapper());
However, if I want to select multiple things (like data from a left join), it would be convenient to not use the RecordMapper in the last step (fetch step) but already during the select step as I have seen as an example here with POJOs, not RecordMappers: ctx.select(row(A, B, C).mapping(MyPojo::new), otherFieldsLikeMultiSet)
My question: Is there something like this syntax available for normal RecordMappers as well? The mapping function expects a FunctionN<AllMyFields..., ?> and not something like Function<Record, ?> as the RecordMapper implements.
So some code somewhat like this:
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();
Now, I'd like to have a Result<Record2<UserGroup,String>>. So instead of using the recordmapper "in the end" at fetch phase, I'd like to apply the RecordMapper earlier. I know it's possible when providing a FunctionN to the row object mapping, but my RecordMapper sadly isn't a FunctionN :)
CodePudding user response:
The Row4.mapping(Function4) is just syntax sugar for ad-hoc conversion methods, like SelectField.convertFrom.
Now, Row4<T1, T2, T3, T4> extends SelectField<Record4<T1, T2, T3, T4>>, and thus you can pass any ? super Record4<T1, T2, T3, T4> type to the convertFrom(...) method. Your RecordMapper<Record, UserGroup> extends Function<Record, UserGroup>, so you can pass that directly:
With jOOQ 3.17
Field<UserGroup> field = row(...).convertFrom(new UserGroupMapper());
With jOOQ 3.16
The above SelectField::convertFrom method was pulled up from Field only in jOOQ 3.17, see #13118. Prior to that, you can turn your row() expression into a Field using DSL.field(SelectField):
Field<UserGroup> field = field(row(...)).convertFrom(new UserGroupMapper());
