java - DayToSecond 的 Jooq 平均值

标签 java jooq

我正在尝试使用 Jooq 对嵌套请求中的时间戳字段执行平均。除了 Jooq 无法将 DayToSecond 类型转换为 BigDecimal 之外,我几乎完成了,因为它的转换基于 DayToSecond 字符串表示和 的表示>DayToSecond 看起来像:

00:00:55.646

因此无法完成转换并抛出异常。

我用的是 JOOQ 3.11.2

那就是表格:

CREATE TABLE IF NOT EXISTS MISSION (
  ID         SERIAL PRIMARY KEY,
  START_DATE TIMESTAMP,
  SOLVE_DATE TIMESTAMP);

这就是 JOOQ 请求:

Field<DayToSecond> SPEED = field("SPEED", DayToSecond.class);
Table<Record1<DayToSecond>> nested =
        context.select(
                timestampDiff(Tables.MISSION.SOLVE_DATE,
                              Tables.MISSION.START_DATE)
                                .as(SPEED))
                        .from(Tables.MISSION_USER)
                        .asTable();
context.select(
        avg(nested.field(SPEED)).as("avg"), // Error with this line
        max(nested.field(SPEED)).as("max"),
        min(nested.field(SPEED)).as("min"))
    .from(nested)
    .fetchOne().into(Efficiency.class);

Efficiency 类是一个具有 3 个 int 字段(avg、max、min)的 POJO。

这是堆栈跟踪:

    Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: jOOQ; uncategorized SQLException for SQL [select avg("alias_89583003"."SPEED") as "avg", max("alias_89583003"."SPEED") as "max", min("alias_89583003"."SPEED") as "min" from (select ("public"."mission"."solve_date" - "public"."mission"."start_date") as "SPEED" from "public"."mission") as "alias_89583003"]; SQL state [null]; error code [0]; Error while reading field: "avg", at JDBC index: 1; nested exception is java.sql.SQLException: Error while reading field: "avg", at JDBC index: 1] with root cause
org.postgresql.util.PSQLException: Mauvaise valeur pour le type BigDecimal : 00:00:55.646
    at org.postgresql.jdbc.PgResultSet.toBigDecimal(PgResultSet.java:2885)
    at org.postgresql.jdbc.PgResultSet.toBigDecimal(PgResultSet.java:2894)
    at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:2353)
    at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:396)
    at org.jooq.tools.jdbc.DefaultResultSet.getBigDecimal(DefaultResultSet.java:323)
    at org.jooq.impl.CursorImpl$CursorResultSet.getBigDecimal(CursorImpl.java:695)
    at org.jooq.impl.DefaultBinding$DefaultBigDecimalBinding.get0(DefaultBinding.java:1363)
    at org.jooq.impl.DefaultBinding$DefaultBigDecimalBinding.get0(DefaultBinding.java:1326)
    at org.jooq.impl.DefaultBinding$AbstractBinding.get(DefaultBinding.java:774)
    at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.setValue(CursorImpl.java:1720)
    at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1689)
    at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1654)
    at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:125)
    at org.jooq.impl.CursorImpl$CursorIterator.fetchNext(CursorImpl.java:1618)
    at org.jooq.impl.CursorImpl$CursorIterator.hasNext(CursorImpl.java:1585)
    at org.jooq.impl.CursorImpl.fetchNext(CursorImpl.java:407)
    at org.jooq.impl.Tools.fetchOne(Tools.java:1762)
    at org.jooq.impl.AbstractResultQuery.fetchOne(AbstractResultQuery.java:545)
    at org.jooq.impl.SelectImpl.fetchOne(SelectImpl.java:2879)

那么,是否有一种解决方案可以在 DayToSecond 上执行平均值?

最佳答案

您可以通过从间隔差异中提取秒数并在 Java 中将其作为纯数字获取来完全避免 DayToSecond:

使用此函数(部分取自 here ):

public static Field<Integer> diff(Field<Instant> field1, Field<Instant> field2) {
    return DSL.field("extract(epoch from {0} - {1})", Integer.class, field1, field2);
}

为了改变这个:

timestampDiff(Tables.MISSION.SOLVE_DATE, Tables.MISSION.START_DATE)

进入这个:

diff(Tables.MISSION.SOLVE_DATE, Tables.MISSION.START_DATE)

然后你将SPEED声明为:

Field<Integer> SPEED = field("SPEED", Integer.class);

关于java - DayToSecond 的 Jooq 平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51328538/

相关文章:

java - 当给定的类名是字符串时如何调用另一个类中的方法

java - 如何为 javax.swing.JTable() 重新定义 VerticalTableHeaderCellRenderer() 以垂直写入文本

java - 两个不同项目的 R.java 的资源 id 冲突

java - jOOQ 字段<T> = DSL.any(DSL.val(T...))

java - JOOQ强制类型代码生成

java - 服务器提供实时游戏状态更新

c# - 评论接口(interface)、实现还是两者兼而有之?

java - 在运行时从头开始设置数据库

sql - 在 JOOQ DSL 中使用带有连接别名的 PosgreSQL array_agg

java - 按用户定义类型过滤时如何在 jooq 中形成 where 子句