首页 > 解决方案 > jdbi3 withHandle在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()
                }

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()
                }

标签: kotlinjdbi

解决方案


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

根据错误消息,编译器无法推断 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() 
}

这里的关键区别是jdbi.useHandle<Exception>{ ...

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

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


推荐阅读