当前位置: 首页 > 知识库问答 >
问题:

有没有合适的方法可以使用JOOQ为所有方言创建一个带有枚举的表?

翁翰墨
2023-03-14

我创建了一个JOOQ脚本,该脚本由Flyway执行,以创建一个带有一个枚举的表。当生成运行PostgresSQL实例的方案时,生成的POJO枚举信息将丢失,并且该字段只是一个字符串。

sl.alterTable("tableName").addColumn("column", SQLDataType.VARCHAR.asEnumDataType(MyEnum.class)).execute();

// ...

enum MyEnum implements EnumType {
    A("A"),
    B("B");

    private final String literal;

    MyEnum(String literal) {
        this.literal = literal;
    }

    @Override
    public String getLiteral() {
        return literal;
    }

    @Override
    public String getName() {
        return V2020_01_09__table_constant.State.class.getName().toLowerCase();
    }
}

要从PostgresSQL数据库生成枚举到Java,我需要执行以下黑客操作并区分DB方言。因此,我需要对每次迁移都以特殊的方式处理枚举。

if (dsl.dialect().equals(SQLDialect.POSTGRES)) {
    dsl.createType("MyEnum").asEnum("a", "b").execute();
    dsl.alterTable("tableName").addColumn("column", new DefaultDataType<>(null, MyEnum.class, "myenum")).execute();
} else {
    dsl.alterTable("tableName").addColumn("column", SQLDataType.VARCHAR.asEnumDataType(MyEnum.class)).execute();
}

最后,我替换了支持枚举的H2,一切看起来都正常。我有Java POJO中的enum。但可能在PostgresSQL上运行的生产数据库仍然获取varchars类型。

有没有一种方法可以生成带有枚举的PostgresSQL模式,而不隐式地说创建我的枚举类型?

共有1个答案

那正初
2023-03-14

最后,我替换了H2,它支持枚举,一切看起来都很好。我在POJOS中有枚举Java。

上次我检查时,H2的枚举实现仍然缺少很多东西,我们还不能正确地逆向工程它们的枚举,所以这不会很好地工作。

有没有一种方法可以生成带有枚举的PostgresSQL模式,而不隐式地说创建我的枚举类型?

如果您连接到实际的数据库实例以生成代码,那么在PostgreSQL中使用枚举应该不会有任何问题。如果要使用特定于供应商的数据类型,如枚举、数组等,我建议从等式中删除H2。使用H2会一直带来痛苦。我假设您正在使用H2进行集成测试。我建议将testcontainers与实际的PostgreSQL数据库结合使用。

 类似资料:
  • 问题内容: 枚举可以有抽象方法吗?如果是这样,有什么用,并给出一个场景来说明这种用法。 问题答案: 是的,但是您可能更喜欢实现接口的枚举,请看这里。我认为它看起来好多了。这是抽象方法的示例:

  • 我有一个包含两个值的枚举类,我想创建一个接收一个值并返回另一个值的方法。我还想保持类型安全(这就是为什么我使用枚举类而不是枚举)。 http://www.cplusplus.com/doc/tutorial/other_data_types/没有提到任何关于方法的内容,但是,我的印象是,任何类型的类都可以有方法。

  • 我试图在foreach循环中用mybatis动态地过滤一个select-query。

  • 问题内容: 我一直在寻找使用CSS编写的类似Google Chrome的标签,但是找不到。 我正在尝试复制外观,以便在Web应用程序或网站中使用它。 问题答案: 是的,用css3 艾夫(Ive)发表了一篇关于如何对其进行深入研究的博客,可悲的是,除非您使用图像,否则诺努斯将无法继续工作 编辑: 删除了对redeyeoperations的旧引用,现在导致其链接服务器场。这是一个较轻的版本,它在第三方

  • 问题内容: 我正在尝试建立一个简单的Java程序,该程序可以从其他多个图像(jpg)创建一个动画gif。谁能给我一个有关如何在Java中实现此目标的信息?我已经搜索过Google,但找不到任何真正有用的信息。 感谢你们! 问题答案: 这里有一个类的示例,该类从不同的图像创建动画的gif: 链接 编辑:链接似乎已死。 无论如何,为了清楚起见,这段代码是由Elliot Kroo完成的。 编辑2:感谢您

  • 问题内容: 从另一个问题中,我了解到在Java中 可以为Enum的每个实例定义特定的方法 : 让我感到惊讶的是,这甚至是可能的,每个实例专用的“专有方法”是否都有 名称 来查找文档? 另外, 应该如何使用 ?由于下一个未编译: 我应该如何使用这些“专有”方法? 问题答案: 您不能引用这些方法,因为您正在有效地为每个枚举创建匿名(*)类。由于它是匿名的,因此只能从匿名类本身内部或通过反射引用此类方法