gpt4 book ai didi

java - 如何使用 JSQLparser 从 "From Clause"获取多个子查询?

转载 作者:行者123 更新时间:2023-11-29 18:29:26 28 4
gpt4 key购买 nike

我想获取 from 子句中的所有子查询,但是当我使用时

 FromItem fromItems = plainSelect.getFromItem();

它只是检索 from 子句中的第一个子查询以及当我使用时

 Expression exp = plainSelect.getJoins().get(i);

它检索 from 语句中的表而不是子查询。

最佳答案

这里是一些代码片段。您必须知道,第一个表/子选择存储在 PlainSelect 的 fromItem 中,并且以下内容存储在联接中。你必须处理两者。这是由于 JSqlParser 使用的解析架构。

在 JSqlParser 中,您有两种类型的遍历返回的对象层次结构:1. 访问者模式,2. 直接对象层次结构访问。我在这个小例子中实现了两者。

编辑:为了查找 JSqlParser 标识的分层所有子查询,我添加了 Type 3,这是一种 hack,因为我不知何故误用了解析器。

public class SimpleSqlParser10 {
public static void main(String args[]) throws JSQLParserException {
String sql = "SELECT * FROM myTable, (select * from myTable2) as data1, (select b from myTable3) as data2";
Select select = (Select)CCJSqlParserUtil.parse(sql);
System.out.println(select.toString());


System.out.println("Type 1: Visitor processing");
select.getSelectBody().accept(new SelectVisitorAdapter(){
@Override
public void visit(PlainSelect plainSelect) {
plainSelect.getFromItem().accept(fromVisitor);
if (plainSelect.getJoins()!=null)
plainSelect.getJoins().forEach(join -> join.getRightItem().accept(fromVisitor));
}
});

System.out.println("Type 2: simple method calls");
processFromItem(((PlainSelect)select.getSelectBody()).getFromItem());
if (((PlainSelect)select.getSelectBody()).getJoins()!=null)
((PlainSelect)select.getSelectBody()).getJoins().forEach(join -> processFromItem(join.getRightItem()));


System.out.println("Type 3: hierarchically process all subselects");
select.getSelectBody().accept(new SelectDeParser() {
@Override
public void visit(SubSelect subSelect) {
System.out.println(" found subselect=" + subSelect.toString());
super.visit(subSelect); }
});
}

private final static FromItemVisitorAdapter fromVisitor = new FromItemVisitorAdapter() {
@Override
public void visit(SubSelect subSelect) {
System.out.println("subselect=" + subSelect);
}

@Override
public void visit(Table table) {
System.out.println("table=" + table);
}
} ;

private static void processFromItem(FromItem fromItem) {
System.out.println("fromItem=" + fromItem);
}
}

这个输出

SELECT * FROM myTable, (SELECT * FROM myTable2) AS data1, (SELECT b FROM myTable3) AS data2
Type 1: Visitor processing
table=myTable
subselect=(SELECT * FROM myTable2) AS data1
subselect=(SELECT b FROM myTable3) AS data2
Type 2: simple method calls
fromItem=myTable
fromItem=(SELECT * FROM myTable2) AS data1
fromItem=(SELECT b FROM myTable3) AS data2
Type 3: hierarchically process all subselects
found subselect=(SELECT * FROM myTable2) AS data1
found subselect=(SELECT b FROM myTable3) AS data2

关于java - 如何使用 JSQLparser 从 "From Clause"获取多个子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45837017/

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