使用JOOQ解析器API,我可以解析以下查询,并从生成的Query对象获取参数映射。由此,我可以知道有一个参数,它的名称是“ 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.11开始,可用于访问内部表达式树的VisitListenerSPI是SPI,context.configuration()在解析之前必须将其附加到您的SPI 。然后,只要您遍历该表达式树(例如在调用中),就会query.getParams()调用它。
VisitListener
context.configuration()
query.getParams()
但是,有很多手动管道需要完成。例如,VisitListener只会将A.BAZ视为列引用,而不会直接知道A已重命名的表BAR。当您访问BAR A表达式时,您将必须跟踪自己的重命名。
A.BAZ
A
BAR
BAR A