gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:25:27 24 4
gpt4 key购买 nike

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

最佳答案

根据您的问题,我假设您想使用 jOOQ parser API解析您的 SQL 字符串,然后从 jOOQ 的元模型中提取列名。

使用 jOOQ 3.16 查询对象模型 API

jOOQ 3.16推出a new, experimental (as of 3.16) query object model API, which can be traversed ,这将在接下来的几个小版本中得到增强。从jOOQ 3.17开始,当你解析SQL时:

Query query = ctx.parser().parseQuery(sql);

// The QOM.CreateTable type is available in jOOQ 3.17+
if (query instanceof QOM.CreateTable ct) {
for (TableElement te : ct.$tableElements()) {
if (te instanceof Field<?> f) {
System.out.println(f.getName());
}
}
}

早期 jOOQ 版本中的替代方法

目前(从 jOOQ 3.11 开始),元模型无法通过公共(public) 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 的内部结构。

关于java - 如何从 SQL 查询中获取列名(Jooq,Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53990723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com