Jooq操作MySQL临时表字段引用失败,如何获取有效列引用?
解决jOOQ临时表字段引用问题
方法1:复用原表的字段引用
因为临时表是基于TABLE_A的结构创建的,直接使用TABLE_A的字段并指定所属表为临时表即可:
// 创建临时表 Name tmpTableName = DSL.name(TMP_TABLE_NAME); dslContext.createTemporaryTable(tmpTableName) .as(dslContext.select(TABLE_A.fields()).from(TABLE_A)).withNoData().execute(); Table<Record> tmpTable = DSL.table(tmpTableName); // 复用TABLE_A的字段,指定所属临时表 dslContext.update(tmpTable) .set(tmpTable.field(TABLE_A.COL_1), "replacement text") .where(tmpTable.field(TABLE_A.COL_2).startsWith("prefix")) .execute();
这种方式能让jOOQ正确识别字段与临时表的关联,避免返回null。
方法2:显式定义临时表字段
手动指定字段所属的临时表名称,绕过tmpTable.field()的空指针问题:
Name tmpTableName = DSL.name(TMP_TABLE_NAME); dslContext.createTemporaryTable(tmpTableName) .as(dslContext.select(TABLE_A.fields()).from(TABLE_A)).withNoData().execute(); Table<Record> tmpTable = DSL.table(tmpTableName); // 直接定义关联临时表的字段 Field<String> tmpCol1 = DSL.field(DSL.name(tmpTableName, "COL_1"), String.class); Field<String> tmpCol2 = DSL.field(DSL.name(tmpTableName, "COL_2"), String.class); // 执行update操作 dslContext.update(tmpTable) .set(tmpCol1, "replacement text") .where(tmpCol2.startsWith("prefix")) .execute();
方法3:刷新元数据获取临时表(仅部分场景可用)
若必须通过元数据获取,先刷新jOOQ的元数据缓存再尝试:
Name tmpTableName = DSL.name(TMP_TABLE_NAME); dslContext.createTemporaryTable(tmpTableName) .as(dslContext.select(TABLE_A.fields()).from(TABLE_A)).withNoData().execute(); // 刷新元数据缓存 dslContext.meta().refresh(); List<Table<?>> tables = dslContext.meta().getTables(tmpTableName); if (!tables.isEmpty()) { Table<?> tmpTableFromMeta = tables.get(0); dslContext.update(tmpTableFromMeta) .set(tmpTableFromMeta.field("COL_1", String.class), "replacement text") .where(tmpTableFromMeta.field("COL_2", String.class).startsWith("prefix")) .execute(); }
注意:该方法依赖数据库对临时表元数据的暴露,部分数据库可能不支持,前两种方法更可靠。
内容的提问来源于stack exchange,提问作者gph
相关产品推荐
相关产品推荐

