java - JOOQ - 内联转换器未应用
问题描述
在我build.gradle
的forcedTypes
. 这在我需要的地方工作得很好。
forcedType {
userType = 'java.util.List<stormsensor.thor.dto.telemetry.FlowEventType>'
converter = 'stormsensor.thor.config.jooq.StringToFlowEventTypeListConverter'
includeExpression = '.*\\.FLOW_EVENTS'
includeTypes = '.*'
}
但是,我正在尝试将逗号分隔的字符串转换为特定用例的枚举列表:
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);
这会引发异常
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
这是我正在获取的模型:
@Data
@NoArgsConstructor
public class BatchNotificationRuleModel implements Serializable {
private static final long serialVersionUID = 1L;
private List<FlowEventType> notifications;
private List<MessageProtocolType> protocols;
}
我错过了什么吗?
更新:
我可以使用内联转换
//...
.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());
我应用的初始转换器与后期地图转换之间有什么区别?
解决方案
虽然期望Field.as(Field)
将参数字段的名称和类型用于类型强制似乎是合理的,但事实并非如此。根据 Javadoc:
根据另一个字段的名称为该字段创建一个别名。
为了将您的表达式强制转换为所需的数据类型,您必须手动执行此操作:
groupConcatDistinct(NOTIFICATION_RULE.FLOW_EVENT_TYPE)
.coerce(LIST_TYPE)
.as("notifications")
推荐阅读
- javascript - 如何在 JavaScript 的循环中运行异步 $.getJSON 函数?
- mongodb - 查询数组并忽略元素的顺序
- reactjs - Ionic/React - 浏览器自动填充输入项时如何从输入项中获取值?
- excel - 如何过滤然后填充到单独的工作表上?
- powershell - 从 html 元素中提取 http 链接
- python - pytest-cov - 不计算集成测试目录的覆盖率
- ios - iOS屏幕锁定时工作的音频播放器
- go - 一个 lambda 可以调用另一个 lambda,然后在子 lambda 完成之前退出吗?
- r - 如何将单个字符串分成R表中的列
- c# - 如何在构建时为 JetBrains Rider 转换 .Config?