gpt4 book ai didi

java - 从 JOOQ 解析器结果中获取表/列元数据

转载 作者:行者123 更新时间:2023-12-02 00:57:52 24 4
gpt4 key购买 nike

使用 JOOQ 解析器 API,我能够解析以下查询并从结果查询对象中获取参数映射。由此,我可以看出有一个参数,它的名字是“something”。

但是,我无法弄清楚如何确定参数“something”已分配给名为“BAZ”的列,并且该列是表“BAR”的一部分。

解析器 API 是否有办法获取与每个参数关联的表/列元数据?

String sql = "SELECT A.FOO FROM BAR A WHERE A.BAZ = :something";

DSLContext context = DSL.using...
Parser parser = context.parser();
Query query = parser.parseQuery(sql);


Map<String, Param<?>> params = query.getParams();

最佳答案

从 jOOQ 3.16 开始

jOOQ 3.16 引入了一个新的、实验性的(自 3.16 起)查询对象模型 API,可以对其进行遍历,请参阅:

具体来说,你可以这样写:

List<QueryPart> parts = query.$traverse(
Traversers.findingAll(q -> q instanceof Param)
);

或者,为了方便地生成您想要的类型:

Map<String, Param<?>> params = query.$traverse(Traversers.collecting(
Collectors.filtering(q -> q instanceof Param,
Collectors.toMap(
q -> ((Param<?>) q).getParamName(),
q -> (Param<?>) q
)
)
));

Collectors.toMap() 调用可以包含 mergeFunction,以防您两次使用相同的参数名称。

jOOQ 3.16 之前

从 jOOQ 3.11 开始,可用于访问内部表达式树的 SPI 是 VisitListener SPI,在解析之前您必须将其附加到 context.configuration() 中。然后,每当您遍历该表达式树时就会调用它,例如在您的 query.getParams() 调用中。

但是,有相当多的手动管道工作需要完成。例如,VisitListener 只会将 A.BAZ 视为列引用,而不直接知道 A 是重命名的表 BAR。当您访问 BAR A 表达式时,您必须自己跟踪此类重命名。

关于java - 从 JOOQ 解析器结果中获取表/列元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57796087/

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