如何保持 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 个问题:
- 类型安全丢失 - 我必须将值转换为
Integer
。
- 虽然这个字段永远不会为空,但 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
的可空性,这很可能是未指定的)。
假设我想要 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 个问题:
- 类型安全丢失 - 我必须将值转换为
Integer
。 - 虽然这个字段永远不会为空,但 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
的可空性,这很可能是未指定的)。