jdbi3 withHandle 在 kotlin 中抛出错误

Ash*_*ose 2 jdbi kotlin

withHandle 给出错误提示“没有足够的信息来推断类型变量 X”。

但如果我使用

val count = jdbi.withHandleUnchecked { handle ->
                    handle.createQuery("SELECT count(*) FROM levelmaster WHERE `LevelName` = 'Silver' AND `LevelId` >= :ugradingLevel")
                            .bind("ugradingLevel", ugradingLevel)
                            .mapTo(Int::class.java)
                            .findOnly()
                }
Run Code Online (Sandbox Code Playgroud)

withHandleUnchecked 它不会抛出任何错误。

这是我的代码:(使用 withHandle)

handle = jdbi.open() 
val names = jdbi.withHandle { handle ->
                    handle.createQuery("SELECT count(*) FROM levelmaster WHERE `LevelName` = 'Silver' AND `LevelId` >= :ugradingLevel")
                            .bind("ugradingLevel", ugradingLevel)
                            .mapTo(Int::class.java)
                            .findOnly()
                }
Run Code Online (Sandbox Code Playgroud)

小智 5

我今天早些时候遇到了同样的问题。我花了一些时间才弄明白。

根据错误消息,编译器无法推断 X 是什么类型。X 是 useHandle 方法的类型参数,用于指定我们的 HandleConsumer 将返回什么类型的异常(如果有)。在 Kotlin 中,我们用一个匿名函数表示 HandleConsumer,所以实际上这个类型参数应该是我们的 lambda 可能抛出的任何异常。如果您查看 useHandle 方法的定义,就会更容易理解您需要做什么:)。

因此,修复此错误的方法是在 useHandle 之后指定一个显式类型。

这应该修复错误:

jdbi.useHandle<Exception> { handle ->
    handle.createQuery("SELECT count(*) FROM levelmaster WHERE `LevelName` = 'Silver' AND `LevelId` >= :ugradingLevel")
                            .bind("ugradingLevel", ugradingLevel)
                            .mapTo(Int::class.java)                            
                            .findOnly() 
}
Run Code Online (Sandbox Code Playgroud)

这里的主要区别是 jdbi.useHandle<Exception>{ ...

而不仅仅是 jdbi.useHandle{ ...

我希望这有帮助!它肯定也让我绊倒了一分钟。