Почему Mysql INT (10) неподписанный столбец в row.getLong генерирует исключение в jasync-sql - PullRequest
2 голосов
/ 14 марта 2019

INT (10) unsigned в mysql имеет ограничение до 4b + и при использовании с getLong строки выдает следующую ошибку:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at com.github.jasync.sql.db.RowData$DefaultImpls.getLong(RowData.kt:48) ~[jasync-common-0.9.23.jar:?]
    at com.github.jasync.sql.db.general.ArrayRowData.getLong(ArrayRowData.kt:5) ~[jasync-common-0.9.23.jar:?]
    at com.richdevt.hthookserver.repository.ProjectRepository.findProjectEnvironment(ProjectRepository.kt:29) ~[classes/:?]
    at com.richdevt.hthookserver.repository.ProjectRepository$findProjectEnvironment$3.invokeSuspend(ProjectRepository.kt) ~[classes/:?]
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32) [kotlin-stdlib-1.3.21.jar:1.3.21-release-158 (1.3.21)]
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) [kotlinx-coroutines-core-1.1.1.jar:?]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163) [netty-common-4.1.33.Final.jar:4.1.33.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) [netty-common-4.1.33.Final.jar:4.1.33.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-common-4.1.33.Final.jar:4.1.33.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:495) [netty-transport-4.1.33.Final.jar:4.1.33.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) [netty-common-4.1.33.Final.jar:4.1.33.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.33.Final.jar:4.1.33.Final]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_152

Почему преобразование невозможно?

1 Ответ

2 голосов
/ 14 марта 2019

Тип INT(10) UNSIGNED имеет размер int (4 байта) и без знака: Какой максимальный размер типа int (10) в Mysql

Однако в Java такого типа нет (т. Е. Максимальное значение больше, чем максимальное значение int для Java). С другой стороны, тип, возвращаемый из MySQL - это INT, как определено здесь: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html без дополнительной информации о unsigned. В таком случае jasync-sql преобразует его в обычный тип Int. Более подробная информация здесь: https://github.com/jasync-sql/jasync-sql/issues/102

В качестве обходного пути для такого случая можно выполнить расширенное преобразование, как предложено здесь: Лучший способ преобразовать целое число со знаком в длинную без знака?

...