Java jOOQ:将select语句中的字段从type1转换为type2

Java jOOQ:将select语句中的字段从type1转换为type2,java,sql,jooq,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.C

我有这样一句话:

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)
);

我能做这个转换吗

正如您在评论中提到的,您不能通过提供获取后如何映射类型的说明来转换jOOQ表达式的类型(尽管这看起来很有趣,但我已经为此创建了一个功能请求:)

您有几个选择:

将转换器附加到表达式 这与功能请求类似,但更为笨拙:

Field diff=DSL.timestampDiff(
DSL.currentTimestamp(),
DSL.时间戳(“2018-01-01 00:00:00”)
);
字段d=DSL.Field(“{0}”,diff.getDataType()
.asConvertedDataType(转换器为空)(
第二节课,
双层,
DayToSecond::getTotalMinutes,
m->DayToSecond.valueOf(m*60000)//此处可选实现
)),diff);
System.out.println(create.select(d.fetchOne());
获取后转换值 当然,您也可以简单地获取一个
DayToSecond
值,然后使用您喜欢的任何工具转换jOOQ
结果,包括:

  • Result.stream()

现在我想起来了,这个表达式是用来创建查询字符串的。因此,转换结果应该在获取结果之后进行,这可以使用.fetch.stream().map(..)实现。我不理解“DSL.using(cn)”的用法,以及它将如何与我的解决方案集成(我不知道在哪里进行转换)。
DSL.using(cn)
与转换无关。为免生疑问,我将其替换为您问题中的
create
。当从JDBC
ResultSet
中获取字段
d
时,会进行转换,因为其数据类型附带了一个
转换器。您可以在
DayToSecond::getTotalMinutes
中放置一个断点,然后逐步执行逻辑以查看发生了什么
DSL.timestampDiff(twLog.STOP_TIME, twLog.START_TIME).map( from -> from.totalMinutes() )