我可以使用JOOQ作为SQL解析器吗?

时间:2019-03-26 11:18:43

标签: java jooq

我正在尝试解析Java中的SELECT语句。我熟悉JOOQ,并希望使用它。我知道它不是明确设计为SQL解析器的,实际上还远远不止于此,所以我在想可能有一种使用其内部解析器解析SELECT查询的方法。

我看到了一些有关如何使用Visitor模式访问JOOQ内部构件的信息,但是我需要使用树状结构在查询内部进行导航,该结构允许分别访问查询的每个部分。我不想在所有用例中都使用“访客”模式。

这可能吗?我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

  

A full-fledged SQL parser is available from DSLContext.parser() and from DSLContext.parsingConnection() (see the manual's section about parsing connections for the latter).

SQL Parsing API页给出了一个简单的示例:

ResultQuery<?> query = 
DSL.using(configuration)
   .parser()
   .parseResultQuery("SELECT * FROM (VALUES (1, 'a'), (2, 'b')) t(a, b)");

parseResultQuery是单个SELECT查询所需的方法,如果您可能有多个查询,请使用parse(String)

答案 1 :(得分:0)

从jOOQ 3.11开始,您确实可以使用<?php function insert($values, $string) { $string = str_replace( [' ? ', '? ', ' ?'], [' %s ', '%s ', ' %s'], $string ); return vsprintf($string, $values); } $string = "Hello ?. My name is ? I am ? years old. How are you?"; $values = ['you', 'Dan', '+- 30']; // Prints: Hello you. My name is Dan I am +- 30 years old. How are you? echo insert($values, $string), PHP_EOL; // Prints: Nice nice! echo insert(['nice'], 'Nice ?!'), PHP_EOL; 提取表达式树并进行一些内部调整(主要取决于通过反射的内部类型),但目前尚无法实现。将来,当可以通过公共API来访问表达式树(并且与SQL生成逻辑完全分离)时,将解决该问题,但现在还没有承诺。