【问题标题】:Create dynamic primary key constraint with JOOQ使用 JOOQ 创建动态主键约束
【发布时间】:2021-07-22 12:12:55
【问题描述】:

我正在使用 JOOQ(JOOQ 中的新手)在我的 Spring Boot 项目中使用 Rest API 在运行时创建数据库。 在一种情况下,我需要创建一个具有复合主键的表,该主键可以是多列的组合。 我正在使用下面的代码来创建约束 -

ArrayList<Constraint> constraints = new ArrayList<>();
constraints.add(constraint(name("pk_" + tableName))
.primaryKey(field("column1"), field("column2")));

我已经有List&lt;Field&lt;?&gt;&gt;,它将用作复合主键。 由于主键约束可以支持 n 列,我怎样才能使这个动态化? 有什么方法可以直接在.primarykey() API 中提供字段列表吗?

【问题讨论】:

    标签: java spring-boot dynamic-sql jooq


    【解决方案1】:

    约束 API 中缺少在这种情况下可能预期的 primaryKey(Collection&lt;? extends Field&lt;?&gt;&gt;) 的通常重载。我为 jOOQ 3.15 创建了一个功能请求:https://github.com/jOOQ/jOOQ/issues/11816

    您可以使用标准 JDK Collection.toArray() 方法使用 ConstraintTypeStep.primaryKey(Field&lt;?&gt;...)

    List<Field<?>> list = ...
    
    // Pre Java 11
    constraints.add(constraint(...).primaryKey(list.toArray(new Field<?>[0])));
    
    // Using new JDK 11 API
    constraints.add(constraint(...).primaryKey(list.toArray(Field<?>[]::new)));
    

    【讨论】:

    • 我在创建索引时也遇到了同样的问题。我在 String 中有 tableName 和List&lt;Field&lt;?&gt;&gt; 你能不能也提供一个解决方案。我正在使用以下函数调用 - dslContext.createIndex().on(name(tableName), name("column1), name("column2");).execute()
    • 只需删除;
    • @luks-eder ; 是一个错字,我需要创建一个包含多个动态列的索引。我也有List&lt;Field&lt;?&gt;&gt; 用于列。
    • 再次使用toArray()。请务必使用on(Table&lt;?&gt;, Field&lt;?&gt;...) 方法。没有on(Name, Field&lt;?&gt;...) 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2015-11-29
    相关资源
    最近更新 更多