JOOQ 从表中获取列
Posted
技术标签:
【中文标题】JOOQ 从表中获取列【英文标题】:JOOQ get Columns from a Table 【发布时间】:2017-06-09 04:41:41 【问题描述】:我尝试从H2
数据库中获取Table
的所有Columns
和JOOQ
(用于测试-稍后可能类似于mysql
或PostGRE
)
一切都很好,但是当我遍历检索到的 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
更新: 我找到了另一种检索列名的方法:
如果您已经拥有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());
问题:Column 是从哪里来的? 答:
DSLContext dslCtx = DSL.using(cfg);
InformationSchema is = dslCtx.informationSchema(tbl);
List<Column> columns = is.getColumns();
Column
的类不在JOOQ
的org.jooq.util.xml.jaxb.Column
package 中;
【问题讨论】:
@LukasEder 我将您问题的答案添加到我原来的问题中;它来自JOOQ
的包裹org.jooq.util.xml.jaxb.Column
哦,对不起,谢谢你的澄清。很快就会回答
忘了说:谢谢你报告这个问题,顺便说一句!
没问题,感谢您的快速回复和即将修复!
【参考方案1】:
这是 jOOQ 3.9.1 中的一个错误,将在 3.10.0 和 3.9.2 中修复: https://github.com/jOOQ/jOOQ/issues/5812
【讨论】:
以上是关于JOOQ 从表中获取列的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 CodeIgniter 3 中的外键从表中获取列数据