我有一些遗留的数据库表和列名,如:

XYZEMP:

  • XYZCMP
  • XYZUSR
  • XYZNME

可以映射到人类可读的

员工

  • 公司
  • 用户名
  • 名称

当我使用标准的JOOQ代码生成时,它会创建Table对象XYXEMP,XyzempRecord等,其中包含XYZCMP列和相应的getter和setter. 有没有什么方法可以将映射传递给生成器,以便生成Table对象Employee、AccesseRecord和人类可读的列名?

我的 idea 是用Custom generator strategy

public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    @Override
    public String getJavaClassName(Definition definition, Mode mode) {
        Map<String, String> tableNamesMapping = readTableNames();
        if (mode == Mode.DEFAULT){ //for table class
             String readableName = tableNamesMapping.get(definition.getOutputName());
             if (readableName == null){
               throw new IllegalStateException("Table " + definition.getOutputName() + " lacks mapping");
             }
             return readableName;
        } else if (mode == Mode.RECORD) { // for record
            // similar logic for record
            return readableName + "Record";
        }
        return super.getJavaClassName(definition, mode);
    }
    @Override
    public String getJavaIdentifier(Definition definition) {
    // somehow similar code for table and and column
    }
    @Override
    public String getJavaSetterName(Definition definition, Mode mode) {
        // somehow similar code for table and and column
    }
    @Override
    public String getJavaGetterName(Definition definition, Mode mode) {
        // somehow similar code for table and and column
    }
    private Map<String, String> readTableNames(){
    //read names mapping from file
    }
    private Map<String, Map<String, String>> readColumnNames(){
    //read names mapping from file
    }
}

映射文件可以用于表:

{
"XYZEMP" : "员工",
...
}

为列

{
"XYZEMP" : {
"XYZCMP" : "公司",
"XYZUSR: : "用户名",
"XYZNME" : "名称"
}
...
}

Do you see smarter way for doing that? In case of my approach - how to distinguish with "Definition" object is it table or column (or any other object) and 为列 which table it belongs to?

推荐答案

回答你的问题

你觉得更聪明的方法吗?

另一种 Select 是使用configurative "matcher strategy",您可以直接以Maven/Gradle/standalone XML格式配置这些映射.我认为,这种方法似乎比你的方法更加冗长和重复.

如何区分"定义"对象是表还是列(或任何其他对象),以及它属于哪一个表?

只需判断definition instanceof TableDefinitiondefinition instanceof ColumnDefinition,并使用它们的API来查找表/列关系.

副作用

请注意,如果使用GeneratorStrategy在Java中重命名列名,jOOQ 3.19不会自动将数据库名称映射到重命名的POJO属性.例如,当你这样做时:

ctx.select(EMPLOYEE.NAME)
   .from(EMPLOYEE)
   .fetchInto(Employee.class);

DefaultRecordMapper章不知道这个名字.它仍然会看到XYZNME列名,Employee POJO没有任何对应关系,unless you tell jOOQ to generate annotations:

public class Employee {
    @Column("XYZNME")
    String name;
}

这只影响到DefaultRecordMapper

Java相关问答推荐

获取拦截器内部的IP地址

如果给定层次 struct 级别,如何从其预序穿越构造n元树

Mat. n_Delete()和Mat. n_release的区别

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

使用REST客户端和对象映射器从字符串反序列化Json

我如何知道MediaDiscoverer何时完成发现介质?

如何将其他属性引用到log4j2 yaml配置中?

Java中不兼容的泛型类型

如何从命令行编译包中的所有类?

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

活泼的一次判断成语,结果中等

我无法在我的Spring Boot应用程序中导入CSV依赖项

Intellij 2023 IDE:始终在顶部显示菜单栏

如何设置默认序列生成器分配大小

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

获取401未经授权,即使在标头中设置了浏览器名称和cookie

如何使用命令行为Java应用程序生成烟雾测试用例

关于正则表达式的一个特定问题,该问题与固定宽度负向后看有关

具有 DayOfWeek 列表的 JPA 实体

一条Java记录可以保存多少个字段?