如何保持 Jooq 中别名列的类型安全?

How to keep type safety for an aliased column in Jooq?

假设我想要 select 特定字段的最大值:

getContext().select( ..., //several fields
                    DSL.max(MY_TABLE.SCORE).as("max_score"))
            .from(MY_TABLE)
            .where(...)
            .groupBy(...);

我获取结果,现在我想获取特定记录的值,所以我这样做:

Integer maxScore = (Integer) record.get("max_score");

这工作得很好,但我有 2 个问题:

  1. 类型安全丢失 - 我必须将值转换为 Integer
  2. 虽然这个字段永远不会为空,但 Jooq 并不知道这一点。如果我将 maxScore 定义为 int 而不是 Integer,我会在这一行收到警告: Unboxing of 'record.get("max_score")' may produce 'NullPointerException'。 对于 table 的“非空”字段,我没有收到此警告。

有没有办法克服这些问题?

Type safety is lost - I must cast the value to Integer.

您可以将其分配给局部变量:

Field<Integer> maxScore = max(MY_TABLE.SCORE).as("max_score");

这样使用:

.select(..., maxScore)
.from(...)

然后:

record.get(maxScore);

If I define maxScore as int instead of Integer, I get a warning [...]

警告可能会通过上述方法消失。而 Record.get(String) returns @Nullable Object, Record.get(Field<T>) 只是 returns T(继承了 T 的可空性,这很可能是未指定的)。