kotlin - 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()
}
解决方案
我今天早些时候遇到了同样的问题。我花了一点时间才弄清楚。
根据错误消息,编译器无法推断 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{ ...
我希望这会有所帮助!它肯定也让我绊倒了一分钟。
推荐阅读
- magento - 快速手册 magento 2.3 QBWC1012
- python - 从异步函数调用同步函数
- server - 露天表演的问题
- c# - 在一个接收端点上具有相同消息类型的多个消费者
- spring-boot - Spring Security + AAD:invalid_token_response 跟进最新可用的 spring-boot 版本(2.1.2)
- java - 带有泛型的 Java 继承
- javascript - Fabric JS - 移动、缩放和旋转时在自定义边界外剪裁文本
- r - 根据两个条件填充 geom_point():在列值上,或者如果值为 0
- c++ - 使用 GetDefaultCommConfig 时出现无效参数错误
- html - 添加 div 导致图像消失