JOOQ从表中获取列

时间:2017-01-24 11:35:31

标签: java sql h2 jooq

我尝试从val res: Int = n * 5数据库中获取Columns Table JOOQ的所有H2(用于测试 - 稍后可能类似于MySQLPostGRE

一切都很好,但是当我遍历我检索到的Columns并将结果记录到控制台时我发现了一个问题(可能是一个BUG?)

我的日志代码如下所示:

System.out.println(String.format("%d > [%s].[%s].[%s]", col.getOrdinalPosition(), col.getTableCatalog(), col.getTableName(), col.getColumnName()));

我的表的输出是这样的:

0 > [TEST].[PERSON].[PERSON]
1 > [TEST].[PERSON].[PERSON]
2 > [TEST].[PERSON].[PERSON]

我预计会是:

0 > [TEST].[PERSON].[ID]
1 > [TEST].[PERSON].[FIRSTNAME]
2 > [TEST].[PERSON].[LASTNAME]

因为表的创建脚本是:

CREATE TABLE PERSON
(
   ID         INTEGER        NOT NULL,
   FIRSTNAME  VARCHAR(255),
   LASTNAME   VARCHAR(255)
);

ALTER TABLE PERSON
   ADD PRIMARY KEY (ID);

所以最后我的问题是:我如何获得'真正'的列名?

编辑:尝试使用JOOQ版本3.9.0和3.9.1

更新: 我找到了另一种检索Column-Names的方法:

如果您已经拥有Table<?>的实例,则可以使用此代码来“修复”该错误

// 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());

问题:专栏来自何处? 回答:

DSLContext dslCtx = DSL.using(cfg);
InformationSchema is = dslCtx.informationSchema(tbl);
List<Column> columns = is.getColumns();

班级Column不属于JOOQ的{​​{1}}个包裹;

1 个答案:

答案 0 :(得分:1)

这是jOOQ 3.9.1中的错误,将在3.10.0和3.9.2中修复: https://github.com/jOOQ/jOOQ/issues/5812