简体   繁体   English

JOOQ - 内联转换器未应用

[英]JOOQ - inline Converter not being applied

In my build.gradle I use a converter in my forcedTypes .在我的build.gradle中,我在forcedTypes类型中使用了转换器。 This works fine where i need it.这在我需要的地方工作得很好。

forcedType {
    userType = 'java.util.List<stormsensor.thor.dto.telemetry.FlowEventType>'
    converter = 'stormsensor.thor.config.jooq.StringToFlowEventTypeListConverter'
    includeExpression = '.*\\.FLOW_EVENTS'
    includeTypes = '.*'
}

However, I am trying to convert a comma separated string into a list of enums for a specificuse case:但是,我正在尝试将逗号分隔的字符串转换为特定用例的枚举列表:

DataType<List<FlowEventType>> LIST_TYPE = SQLDataType.VARCHAR.asConvertedDataType(new StringToFlowEventTypeListConverter());

ctx.select(
  groupConcatDistinct(NOTIFICATION_RULE.FLOW_EVENT_TYPE).as(field(name("notifications"), LIST_TYPE))
)
.from(NOTIFICATION_RULE)
.groupBy(MONITORING_POINT_ID)
.fetchInto(BatchNotificationRuleModel.class);

This throws an exception这会引发异常

org.jooq.exception.MappingException: An error ocurred when mapping record to class stormsensor.thor.dto.notification.batch.BatchNotificationRuleModel
    at org.jooq.impl.DefaultRecordMapper$MutablePOJOMapper.map(DefaultRecordMapper.java:802)
    at org.jooq.impl.DefaultRecordMapper.map(DefaultRecordMapper.java:500)
    at org.jooq.impl.ResultImpl.into(ResultImpl.java:1284)
    at org.jooq.impl.AbstractResultQuery.fetchInto(AbstractResultQuery.java:1550)
    at org.jooq.impl.SelectImpl.fetchInto(SelectImpl.java:3746)
    at stormsensor.thor.repository.notification.BatchNotificationRuleRepositoryJdbcImpl.save(BatchNotificationRuleRepositoryJdbcImpl.java:98)
Caused by: org.jooq.exception.DataTypeException: Cannot convert from CRITICAL_DEPTH,NON_TIDAL_CSO (class java.lang.String) to interface java.util.List
    at org.jooq.tools.Convert$ConvertAll.fail(Convert.java:1194)
    at org.jooq.tools.Convert$ConvertAll.from(Convert.java:1083)
    at org.jooq.tools.Convert.convert0(Convert.java:324)
    at org.jooq.tools.Convert.convert(Convert.java:316)
    at org.jooq.tools.Convert.convert(Convert.java:387)
    at org.jooq.impl.AbstractRecord.get(AbstractRecord.java:275)
    at org.jooq.impl.DefaultRecordMapper$MutablePOJOMapper.map(DefaultRecordMapper.java:830)
    at org.jooq.impl.DefaultRecordMapper$MutablePOJOMapper.map(DefaultRecordMapper.java:762)
    ... 72 more

This is the model I am fetching into:这是我要进入的 model:

@Data
@NoArgsConstructor
public class BatchNotificationRuleModel implements Serializable {
    private static final long serialVersionUID = 1L;

    private List<FlowEventType> notifications;
    private List<MessageProtocolType> protocols;
}

Am I missing something?我错过了什么吗?

UPDATE:更新:

I am able to convert inline using我可以使用内联转换

//...
.groupBy(MONITORING_POINT_ID)
.fetchStream().map(e -> {
    Converter<String, List<FlowEventType>> converter = new StringToFlowEventTypeListConverter();
    List<FlowEventType> notifications = e.get(field(name("notifications"), String.class), converter);
    return BatchNotificationRuleModel.builder().notifications(notifications).build();
}).collect(toList());

What is the difference between the initial converter I apply vs the late stage map conversion?我应用的初始转换器与后期 map 转换之间有什么区别?

While it seems reasonable to expect that Field.as(Field) would use the argument field's name and type for type coercion, this is not the case.虽然期望Field.as(Field)将使用参数字段的名称类型进行类型强制似乎是合理的,但事实并非如此。 As per the Javadoc:根据 Javadoc:

Create an alias for this field based on another field's name.根据另一个字段的名称为该字段创建一个别名。

In order to coerce your expression to the desired data type, you have to do this, manually:为了将您的表达式强制转换为所需的数据类型,您必须手动执行此操作:

groupConcatDistinct(NOTIFICATION_RULE.FLOW_EVENT_TYPE)
  .coerce(LIST_TYPE)
  .as("notifications")

See Field.coerce(DataType)Field.coerce(DataType)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM