gpt4 book ai didi

java - jOOQ - 将运行时映射与手动创建的字段结合使用

转载 作者:行者123 更新时间:2023-11-30 05:32:42 27 4
gpt4 key购买 nike

在我的项目中,我有一个有问题的表(此处名为 PROBLEMATIC),其中包含一些始终存在的列(在架构中定义,例如:id),并且当应用程序运行时,会动态添加或删除其他列。我可以通过一个返回适当 Field 对象的简单函数来使用这些“动态”列:

public static <T> Field<T> getField(String fieldName, Class<T> type) {
return DSL.field(DSL.name(PROBLEMATIC.getName(), fieldName), type);
}

该函数运行良好,我可以使用它返回的 Field 对象创建 jOOQ 查询。

当我想添加一个运行时映射来在渲染的查询中重命名这个有问题的表时,问题就开始了。

Settings settings = new Settings()
.withRenderSchema(false)
.withRenderNameStyle(RenderNameStyle.QUOTED)
.withRenderCatalog(false)
.withRenderMapping(new RenderMapping()
.withSchemata(new MappedSchema()
.withInput("PUBLIC")
.withTables(
new MappedTable().withInput("problematic").withOutput("another_problematic")
)
));

当我使用 jOOQ 创建简单查询时,映射部分起作用。

dsl.select(PROBLEMATIC.ID, getField("dynamic1", String.class), getField("dynamic2", String.class))
.from(PROBLEMATIC)
.fetch();

呈现的查询:

select "another_problematic"."id", "problematic"."dynamic1", "problematic"."dynamic2" from "another_problematic"

问题是:jOOQ 正确替换了架构中定义的那些列和 FROM 子句的表名。使用 DSL.field() 方法创建的列的字段不受影响。

在这种情况下如何使用运行时映射?

最佳答案

这是 jOOQ 中的一个错误:https://github.com/jOOQ/jOOQ/issues/8991 。至少,是为了DSL.field(Name)调用,生成合格的字段引用。

解决方法是直接从 PROBLEMATIC 取消引用该列表,例如

public static <T> Field<T> field(String fieldName, Class<T> type) {
return PROBLEMATIC.field(fieldName, type);
}

为了避免产生疑问,请注意:DSL.field(String, Class<?>)调用是 plain SQL API 的一部分。那里可能有任何表达式,包括 field("a + b") 。由于 jOOQ 不解析这些表达式,因此不可能在那里应用任何模式映射。我知道您没有这样做,但正在阅读此问题的其他人可能会这样做。

关于java - jOOQ - 将运行时映射与手动创建的字段结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222533/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com