cod*_*ing 4 java sql jsqlparser
我想使用 JSqlParser 完整、简洁地解析 SQL where 子句。很容易将其解析为单独的条件语句,如下所示
String whereClause = "a=3 AND b=4 AND c=5";
Expression expr = CCJSqlParserUtil.parseCondExpression(whereClause);
expr.accept(new ExpressionVisitorAdapter() {
@Override
public void visit(AndExpression expr) {
if (expr.getLeftExpression() instanceof AndExpression) {
expr.getLeftExpression().accept(this);
} else if ((expr.getLeftExpression() instanceof EqualsTo)){
System.out.println(expr.getLeftExpression());
}
System.out.println(expr.getRightExpression());
}
});
Run Code Online (Sandbox Code Playgroud)
这将产生输出:
a=3
b=4
c=5
Run Code Online (Sandbox Code Playgroud)
我想要的是获取每个单独表达式的左侧、运算符和右侧,以便我可以将值放入一些现有的过滤器对象中。
我知道您可以覆盖每种类型的运算符的访问函数,如下所示:
expr.accept(new ExpressionVisitorAdapter() {
@Override
public void visit(AndExpression expr) {
if (expr.getLeftExpression() instanceof AndExpression) {
expr.getLeftExpression().accept(this);
} else if ((expr.getLeftExpression() instanceof EqualsTo)){
expr.getLeftExpression().accept(this);
System.out.println(expr.getLeftExpression());
}
expr.getRightExpression().accept(this);
System.out.println(expr.getRightExpression());
}
@Override
public void visit(EqualsTo expr) {
System.out.println(expr.getLeftExpression());
System.out.println(expr.getStringExpression());
System.out.println(expr.getRightExpression());
}
Run Code Online (Sandbox Code Playgroud)
});
这将为您提供以下输出:
a
=
3
a=3
b
=
4
b=4
c
=
5
c=5
Run Code Online (Sandbox Code Playgroud)
但这仅涵盖通过 AND 组合在一起的 EqualsTo 条件语句。正如您所看到的,您必须为每个逻辑运算符创建一个 if 语句,并为每个比较运算符重写 Visit() 函数。有更简单的方法吗?
使用ExpressionVisitorAdapter,您可以覆盖
protected void visitBinaryExpression(BinaryExpression expr)
Run Code Online (Sandbox Code Playgroud)
每个表达式都需要它。
操作也是二元表达式。因此,您需要通过 instanceof ComparisonOperator检查类型。这将处理所有比较器,而不是像 + * 这样的操作。
这应该可以做到。我删除了 AND 的访问,并用更多表达式扩展了你的 whereClause。
String whereClause = "a=3 AND b=4 AND c=5 AND d>5 AND x<10";
Expression expr = CCJSqlParserUtil.parseCondExpression(whereClause);
expr.accept(new ExpressionVisitorAdapter() {
@Override
protected void visitBinaryExpression(BinaryExpression expr) {
if (expr instanceof ComparisonOperator) {
System.out.println("left=" + expr.getLeftExpression() + " op=" + expr.getStringExpression() + " right=" + expr.getRightExpression());
}
super.visitBinaryExpression(expr);
}
});
Run Code Online (Sandbox Code Playgroud)
这输出:
left=a op== right=3
left=b op== right=4
left=c op== right=5
left=d op=> right=5
left=x op=< right=10
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6231 次 |
| 最近记录: |