JOOQ 从表中获取列

Posted

技术标签:

【中文标题】JOOQ 从表中获取列【英文标题】:JOOQ get Columns from a Table 【发布时间】:2017-06-09 04:41:41 【问题描述】:

我尝试从H2 数据库中获取Table 的所有ColumnsJOOQ(用于测试-稍后可能类似于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

更新: 我找到了另一种检索列名的方法:

如果您已经拥有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 的类不在JOOQorg.jooq.util.xml.jaxb.Columnpackage 中;

【问题讨论】:

@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 中的外键从表中获取列数据

SQL 从表中获取值

php 从表中的多个列获取数据作为数组并对其进行操作

从表中获取数据的困难

雪花上的 SQL 存储过程将绑定列视为字符串,并且它没有从表中获取其值

在MS Access中,从表中的3列一起获取相同的值并显示