JOOQ 从 Table 获取列
JOOQ get Columns from a Table
我尝试从 H2
数据库中获取带有 JOOQ
的 Table
的所有 Columns
(用于测试 - 稍后它可能类似于 MySQL
或 PostGRE
)
一切都很好,但是当我遍历检索到的 Columns
并将结果记录到控制台时,我注意到一个问题(可能是 BUG?)
我的日志代码如下所示:
System.out.println(String.format("%d > [%s].[%s].[%s]", col.getOrdinalPosition(), col.getTableCatalog(), col.getTableName(), col.getColumnName()));
我的 Table 的输出是这样的:
0 > [TEST].[PERSON].[PERSON]
1 > [TEST].[PERSON].[PERSON]
2 > [TEST].[PERSON].[PERSON]
我预计会是:
0 > [TEST].[PERSON].[ID]
1 > [TEST].[PERSON].[FIRSTNAME]
2 > [TEST].[PERSON].[LASTNAME]
因为 table 的创建脚本是:
CREATE TABLE PERSON
(
ID INTEGER NOT NULL,
FIRSTNAME VARCHAR(255),
LASTNAME VARCHAR(255)
);
ALTER TABLE PERSON
ADD PRIMARY KEY (ID);
所以最后我的问题是:如何获取 'real' 列名?
编辑:尝试使用 JOOQ
版本 3.9.0 和 3.9.1
更新:
我找到了另一种检索列名的方法:
如果您已经拥有 Table<?>
的实例,您可以使用此代码来 'fix' 错误
// ordinal position starts at 1 but the fields-array starts at 0!
Field<?> f = tbl.fields()[col.getOrdinalPosition() - 1];
// this is needed due a bug in JOOQ, where the ColumnName is returned incorrect
col.setColumnName(f.getName());
问:Column从哪里来?
答案:
DSLContext dslCtx = DSL.using(cfg);
InformationSchema is = dslCtx.informationSchema(tbl);
List<Column> columns = is.getColumns();
Class Column
不在 JOOQ
的 org.jooq.util.xml.jaxb.Column
包中;
这是 jOOQ 3.9.1 中的错误,将在 3.10.0 和 3.9.2 中修复:
https://github.com/jOOQ/jOOQ/issues/5812
我尝试从 H2
数据库中获取带有 JOOQ
的 Table
的所有 Columns
(用于测试 - 稍后它可能类似于 MySQL
或 PostGRE
)
一切都很好,但是当我遍历检索到的 Columns
并将结果记录到控制台时,我注意到一个问题(可能是 BUG?)
我的日志代码如下所示:
System.out.println(String.format("%d > [%s].[%s].[%s]", col.getOrdinalPosition(), col.getTableCatalog(), col.getTableName(), col.getColumnName()));
我的 Table 的输出是这样的:
0 > [TEST].[PERSON].[PERSON]
1 > [TEST].[PERSON].[PERSON]
2 > [TEST].[PERSON].[PERSON]
我预计会是:
0 > [TEST].[PERSON].[ID]
1 > [TEST].[PERSON].[FIRSTNAME]
2 > [TEST].[PERSON].[LASTNAME]
因为 table 的创建脚本是:
CREATE TABLE PERSON
(
ID INTEGER NOT NULL,
FIRSTNAME VARCHAR(255),
LASTNAME VARCHAR(255)
);
ALTER TABLE PERSON
ADD PRIMARY KEY (ID);
所以最后我的问题是:如何获取 'real' 列名?
编辑:尝试使用 JOOQ
版本 3.9.0 和 3.9.1
更新: 我找到了另一种检索列名的方法:
如果您已经拥有 Table<?>
的实例,您可以使用此代码来 'fix' 错误
// ordinal position starts at 1 but the fields-array starts at 0!
Field<?> f = tbl.fields()[col.getOrdinalPosition() - 1];
// this is needed due a bug in JOOQ, where the ColumnName is returned incorrect
col.setColumnName(f.getName());
问:Column从哪里来? 答案:
DSLContext dslCtx = DSL.using(cfg);
InformationSchema is = dslCtx.informationSchema(tbl);
List<Column> columns = is.getColumns();
Class Column
不在 JOOQ
的 org.jooq.util.xml.jaxb.Column
包中;
这是 jOOQ 3.9.1 中的错误,将在 3.10.0 和 3.9.2 中修复: https://github.com/jOOQ/jOOQ/issues/5812