Jooq自定义DefaultGeneratorStrategy:获取POJO类名实现泛型CrudDao
Jooq生成器配置:让DAO继承泛型CrudDao接口
核心修正与实现步骤
修正Mode判断
你当前的第二个if误将Mode.POJO作为目标,实际应该针对Mode.DAO处理——我们要给DAO类添加接口实现,而非POJO。获取POJO全限定类名
DAO对应的Definition本质是TableDefinition,可以通过Jooq内置的getJavaClassName方法,传入TableDefinition和Mode.POJO,直接拿到符合你配置的POJO全类名,无需手动转换表名。构造泛型接口字符串
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
相关产品推荐
相关产品推荐

