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

标签 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>我需要将其转换为 Field<Double>使用 DayToSecond.totalMinutes()

我找不到这样的API,例如:

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

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

最佳答案

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

您有多种选择:

将转换器附加到您的表达式

这类似于功能请求 #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,包括:

关于java - jOOQ:将select语句中的字段从type1转换为type2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48448131/

相关文章:

java - 指定不带表的字段

java - 请参阅调试期间真实设备中的共享首选项 xml 文件

java - 为 JLabel 使用自定义字体

java 7 和 java 8 中的 javac 相等运算符

sql - 登录失败。用户 'NT AUTHORITY\NETWORK 登录失败

python - 如何从多个表中检索数据

java - nrjavaserial 和对/var/lock 的权限(链接到/run/lock)

java - 如何使用某些与 SQL 兼容的列类型在 Spring JPA 中存储 Joda 时间(任何)?

java - Spring Boot JOOQ 集成 - 编译问题

postgresql - 使用 jOOQ 获取表列表