在准备好的语句中将负 java long 转换为 clickhouse Uint64

Convert negative java long to clickhouse Uint64 in prepared statement

有没有办法在插入之前将负长整型转换为 Uint64(clickhouse 数据类型)。目前

preparedStatement.setObject(columnNumber, -3108819769473315784);
preparedStatement.execute();

抛出以下异常

ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 321, host:
localhost, port: 33493; Code: 321, e.displayText() = DB::Exception: Expression returns value
NULL, that is out of range of type UInt64, at: -3108819769473315784

我明白为什么 clickhouse 会抱怨。你能建议我解决这个问题的方法吗?有什么方法可以将这个负 long 转换为其他类型的对象吗? 提前谢谢你。

您应该在将值发送到 ClickHouse 之前对其进行处理。
也就是说,当向 UInt 类型的列插入负值时,您需要手动将其转换为正值/任何您希望它在该目标类型范围内在 ClickHouse 中表示的值。

同样适用于例如。在发送到不可为空的列类型时处理 nulls。

从 Java 8 开始你可以使用 Long.toUnsignedString(values):

preparedStatement.setObject(columnNumber, Long.toUnsignedString( -3108819769473315784));