You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDBI Kotlin SqlObject插件Kotlin接口DAO返回类型异常求助

JDBI Kotlin SqlObject插件@SqlUpdate返回类型问题解决

问题重现

DAO接口代码:

interface DTaskStatusDao {
   @Timestamped
   @SqlUpdate(ADD_TASK_STATUS_ENTRY)
   suspend fun insertTask(@BindKotlin @BindMethods taskStatus: TaskStatus<*>)
}

使用代码:

val dao = jdbi.onDemand(DTaskStatusDao::class)
dao.insertTask(it)

触发异常:
DTaskStatusDao.insertTask method is annotated with @SqlUpdate so should return void, boolean, or Number but is returning

核心原因

Kotlin的无返回值suspend函数默认返回Unit,旧版本JDBI Kotlin插件未正确将Kotlin的Unit映射为Java的void,导致类型校验失败;同时未显式声明返回类型时,JDBI的类型解析逻辑无法识别正确的返回类型。

解决方案

  1. 显式声明返回类型为Unit
    明确指定函数返回Unit,配合新版JDBI Kotlin插件可让框架正确识别为Java的void:

    interface DTaskStatusDao {
       @Timestamped
       @SqlUpdate(ADD_TASK_STATUS_ENTRY)
       suspend fun insertTask(@BindKotlin @BindMethods taskStatus: TaskStatus<*>): Unit
    }
    
  2. 确保正确注册Kotlin插件
    初始化Jdbi时必须安装Kotlin插件,否则无法处理Kotlin特有的类型和suspend函数:

    val jdbi = Jdbi.create(dataSource)
    jdbi.installPlugin(KotlinPlugin())
    
  3. 返回受影响行数(可选)
    若需要获取SQL执行后受影响的行数,可直接声明返回类型为Int(Kotlin的Int会被JDBI正确映射为Java的int):

    interface DTaskStatusDao {
       @Timestamped
       @SqlUpdate(ADD_TASK_STATUS_ENTRY)
       suspend fun insertTask(@BindKotlin @BindMethods taskStatus: TaskStatus<*>): Int
    }
    

版本要求

确保使用JDBI 3.20.0及以上版本,该版本对Kotlin的Unit类型和suspend函数支持更为完善,完全无需在Java文件中编写DAO接口。

内容的提问来源于stack exchange,提问作者J. Lockhart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:06:21