我正在尝试用Java解析SELECT语句。我对JOOQ很熟悉,并希望能够使用它。我知道它没有明确地设计为SQL解析器 - 它实际上远远不止于此,所以我想可能有一种方法可以使用它的内部解析器来解析SELECT查询。
我看到了一些有关如何使用访问者模式访问JOOQ内部部件的信息,但我需要使用类似树的结构在查询内部导航,该结构将允许单独访问查询的每个部分。我不想对所有用例使用访问者模式。
这可能吗?我该怎么做呢?
从jOOQ 3.11开始,虽然您确实可以使用VisitListener
提取表达式树并对内部进行一些调整(主要取决于通过反射的内部类型),但您目前无法做到。将来可以解决这个问题,因为表达式树可以通过公共API访问(并且与SQL生成逻辑完全分离),但还没有任何承诺。
SQL Parsing API页面给出了这个简单的例子:
ResultQuery<?> query =
DSL.using(configuration)
.parser()
.parseResultQuery("SELECT * FROM (VALUES (1, 'a'), (2, 'b')) t(a, b)");
parseResultQuery
是单个SELECT查询所需的方法,如果您有多个查询,请使用parse(String)
。