您好,我在从SQL查询中获取值时遇到问题(在Java中使用jooq库)?
create table `filetest`(`id` int not null auto_increment, `Meno` varchar(21) null, `Priezvisko` varchar(24) null, `Vek` int null, constraint `pk_filetest` primary key (`id`))
或
insert into `filetest` (`Meno`, `Priezvisko`, `Vek`) values ('Jack', 'Daniels', '21')
我需要获取(解析/获取)的是值:Meno,Priezvisko,Vek。 是否可以通过某种方式从表的列的sql查询名称中获取它(使用某些jooq方法)?
答案 0 :(得分:1)
根据您的问题,我假设您想使用jOOQ parser API来解析您的SQL字符串,然后从jOOQ的元模型中提取列名。
当前(从jOOQ 3.11开始),元模型无法通过公共API使用。您只能使用VisitListener
(它是在元模型中包含的每个QueryPart
(即,表达式树元素)上调用的SPI)访问它的方法。该示例实现可以为您提供一个想法:
import org.jooq.*;
import org.jooq.impl.*;
public class Columns {
public static void main(String[] args) {
var parser =
DSL.using(new DefaultConfiguration().set(new DefaultVisitListener() {
@Override
public void visitStart(VisitContext ctx) {
if (ctx.queryPart() instanceof Field
&& !(ctx.queryPart() instanceof Param))
System.out.println(((Named) ctx.queryPart()).getQualifiedName());
}
})).parser();
System.out.println("Query 1");
System.out.println("-------");
parser.parseQuery("create table `filetest`(`id` int not null auto_increment, `Meno` varchar(21) null, `Priezvisko` varchar(24) null, `Vek` int null, constraint `pk_filetest` primary key (`id`))").getSQL();
System.out.println();
System.out.println("Query 2");
System.out.println("-------");
parser.parseQuery("insert into `filetest` (`Meno`, `Priezvisko`, `Vek`) values ('Jack', 'Daniels', '21')").getSQL();
}
}
它将打印:
Query 1
-------
"id"
"Meno"
"Priezvisko"
"Vek"
"id" -- Field is referenced again from the constraint
Query 2
-------
"Meno"
"Priezvisko"
"Vek"
当然,另一个选择是使用反射来访问jOOQ的内部。