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

Jooq自定义DefaultGeneratorStrategy:获取POJO类名实现泛型CrudDao

Jooq生成器配置:让DAO继承泛型CrudDao接口

核心修正与实现步骤

  1. 修正Mode判断
    你当前的第二个if误将Mode.POJO作为目标,实际应该针对Mode.DAO处理——我们要给DAO类添加接口实现,而非POJO。

  2. 获取POJO全限定类名
    DAO对应的Definition本质是TableDefinition,可以通过Jooq内置的getJavaClassName方法,传入TableDefinition和Mode.POJO,直接拿到符合你配置的POJO全类名,无需手动转换表名。

  3. 构造泛型接口字符串
    getJavaClassImplements返回的是字符串列表,直接拼接出带泛型的全限定接口名即可,Jooq会正确解析这个泛型声明。

修正后的代码示例

override fun getJavaClassImplements(definition: Definition, mode: GeneratorStrategy.Mode): List<String> {
    LOGGER.info("Class Implements: Generator mode is $mode for ${definition.qualifiedName}")
    
    // 给指定前缀的POJO添加NamedEntity继承
    if (mode == GeneratorStrategy.Mode.POJO && definition.name?.startsWith("itr_ne_") == true) {
        return listOf(NamedEntity::class.java.name)
    }
    
    // 给指定前缀的DAO添加CrudDao<POJO>泛型接口实现
    if (mode == GeneratorStrategy.Mode.DAO && definition is TableDefinition && definition.name?.startsWith("itr_ne_") == true) {
        // 获取对应POJO的全限定类名
        val pojoFullClassName = getJavaClassName(definition, GeneratorStrategy.Mode.POJO)
        // 构造带泛型的CrudDao接口字符串
        val crudDaoInterface = "${CrudDao::class.java.name}<${pojoFullClassName}>"
        return listOf(crudDaoInterface)
    }
    
    return emptyList()
}

关键说明

  • 强转TableDefinition:确保我们处理的是表对应的DAO生成逻辑,避免非表Definition的干扰
  • 用内置方法获取POJO类名:遵循你在Jooq配置中定义的命名策略(比如下划线转驼峰、包路径等),比手动转换更可靠
  • 泛型字符串拼接:直接生成com.yourpackage.CrudDao<com.yourpackage.pojo.ItrNeGroup>形式的字符串,Jooq会在生成DAO类时正确添加这个泛型接口实现

内容的提问来源于stack exchange,提问作者mikeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:45:06