【问题标题】:Specifying datatype at runtime using JOOQ使用 JOOQ 在运行时指定数据类型
【发布时间】:2016-06-23 20:12:16
【问题描述】:

我正在使用 JOOQ 从 JAVA 对象生成 SQL。下面是我的代码-

String tableName = "tabel1";
String columnName = "column1";
String dataType = "varchar";

CreateTableAsStep<Record> createStmt = create.createTable(tableName).column(columnName, dataType);

不允许设置字符串数据类型。但是使用 SQLDatatype,我只得到了数据类型的枚举列表,我必须在编译时提供这些列表。是否可以在运行时设置数据类型或以任何方式使用字符串名称获取枚举类型。

感谢任何帮助。

【问题讨论】:

  • 嗯... JooQ 允许您创建类型安全的Field 实例...

标签: java jooq


【解决方案1】:

这里的混淆可能是“运行时”真正发生的事情。如果你在Java中有一个变量,比如:

DataType<?> dataType = SQLDataType.VARCHAR;

这并不意味着这个值是一成不变的。您可以在运行时动态修改它,例如通过让用户从下拉列表中选择真正的数据类型。例如,您可以执行以下操作:

Map<String, DataType<?>> choices = new LinkedHashMap<>();
choices.put("integer", SQLDataType.INTEGER);
choices.put("timestamp", SQLDataType.TIMESTAMP);
choices.put("varchar", SQLDataType.VARCHAR);

然后将其提供给您的 jOOQ 语句:

String tableName = "tabel1";
String columnName = "column1";
String dataType = "varchar";

create.createTable(tableName).column(columnName, choices.get(dataType))...;

请记住,即使编写 jOOQ 语句感觉像是静态 SQL,它实际上也是动态 SQL。您正在运行时通过 jOOQ API 动态构建 SQL 语句。与语句创建有关的所有元素都可以动态更改。

【讨论】:

  • 如果我们可以有一个像 SQLDatatype.valueOf(dataType) 这样的方法,它会为提供的字符串数据类型名称返回匹配的枚举值。
  • 有内部API,但你不应该使用它。原因是:你会提供大写还是小写的数据类型?有长度、精度和规模,还是没有?特定方言版本还是标准版本? DDL 类型还是强制转换类型?
猜你喜欢
  • 2019-03-30
  • 1970-01-01
  • 2012-01-19
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多