如何从SQL查询(Jooq,Java)获取列名

时间:2018-12-31 19:13:31

标签: java jooq

您好,我在从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方法)?

1 个答案:

答案 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的内部。