作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想获取 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/
我是一名优秀的程序员,十分优秀!