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
。当从JDBCResultSet
中获取字段d
时,会进行转换,因为其数据类型附带了一个转换器。您可以在DayToSecond::getTotalMinutes
中放置一个断点,然后逐步执行逻辑以查看发生了什么
DSL.timestampDiff(twLog.STOP_TIME, twLog.START_TIME).map( from -> from.totalMinutes() )