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());
}
});
次の出力が生成されます。
a=3
b=4
c=5
私が望むのは、個々の式の左辺、演算子、および右辺を取得して、既存のフィルター オブジェクトに値を入れることができるようにすることです。
次のように、すべてのタイプの演算子の訪問機能をオーバーライドできることを知っています。
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());
}
});
次の出力が得られます。
a
=
3
a=3
b
=
4
b=4
c
=
5
c=5
ただし、これは AND で結合された EqualsTo 条件ステートメントのみを対象としています。ご覧のとおり、論理演算子ごとに if ステートメントを作成し、比較演算子ごとに visit() 関数をオーバーライドする必要があります。これを行う簡単な方法はありますか?