jOOQ:将select语句中的Field从type1转换为type2

时间:2018-01-25 16:52:32

标签: java sql jooq

我有这样的陈述:

SelectSelectStep<Record14<
    String, String, String, Timestamp, String, String, String, Integer, 
    Timestamp, String, String, String, Integer, DayToSecond>> select = create.select(
    TECHNICAL_WORK.NUMBER, TECHNICAL_CODE.CODE, TECHNICAL_CODE.DESCRIPTION,
    twLog.START_TIME, twStartLog.CODE, twStartLog.FIRST_NAME, twStartLog.LAST_NAME, twStartLog.CATEGORY,
    twLog.STOP_TIME, twEndLog.CODE, twEndLog.FIRST_NAME, twEndLog.LAST_NAME, twEndLog.CATEGORY,
    DSL.timestampDiff(twLog.STOP_TIME, twLog.START_TIME)
);

最后一个字段的类型为Field<DayToSecond>,我需要使用DayToSecond.totalMinutes()将其转换为Field<Double>

我找不到像这样的api,例如:

DSL.timestampDiff(twLog.STOP_TIME, twLog.START_TIME).map( from -> from.totalMinutes() )

我能以某种方式进行此转换吗?

1 个答案:

答案 0 :(得分:1)

正如您在评论中提到的那样,您无法通过提供有关如何在获取后映射类型的说明来转换jOOQ表达式的类型(虽然这看起来很有趣,但我已为此创建了一个功能请求:{{3 }})。

您有几种选择:

将转换器附加到表达式

这与功能请求#7100类似,但更笨拙:

Field<DayToSecond> diff = DSL.timestampDiff(
    DSL.currentTimestamp(), 
    DSL.timestamp("2018-01-01 00:00:00")
);

Field<Double> d = DSL.field("{0}", diff.getDataType()
                                       .asConvertedDataType(Converter.ofNullable(
    DayToSecond.class,
    Double.class,
    DayToSecond::getTotalMinutes,
    m -> DayToSecond.valueOf(m * 60000) // Optional implementation here
)), diff);

System.out.println(create.select(d).fetchOne());

获取后转换值

当然,您也可以简单地获取DayToSecond值,然后使用您偏好的任何工具转换jOOQ Result,包括: