在jsqlparser中为sql查询添加语句

时间:2012-07-16 15:27:51

标签: java sql sql-parser

我想知道是否可以使用jsqlparser为sql查询添加表达式。例如,我想在sql语句中添加一个列和一个值:

原始查询:“INSERT INTO frontendin_reply_to)VALUES(email);”

修改过的查询:“INSERT INTO frontendin_reply_touser_id)VALUES(email,123)”

我设法修改了一个列名,但没有添加一个。

以下是我的代码:

        ExtendedItemsListVisitor visitor = new ExtendedItemsListVisitor() {
            private List expressions = null;

            public List getExpressions() {
                return this.expressions;
            }

            public void setExpressions(ExpressionList expressionList) {
                this.expressions = expressionList.getExpressions();
            }

            public void visit(SubSelect subSelect) {
            }

            public void visit(ExpressionList expressionList) {
                this.expressions = expressionList.getExpressions();
            }
        };

        ItemsList itemsList = ((Insert)statement).getItemsList();
        itemsList.accept(visitor);
        ExpressionList expressions = (ExpressionList)visitor1.getExpressions();

        Expression expression = new StringValue(newValue);
        ExpressionVisitor visitor = new SetValueExpressionVisitor(newValue);

1 个答案:

答案 0 :(得分:2)

我知道有点晚了。但这是一个解决方案。首先,我们创建一个测试插入语句:

Insert insert = (Insert)CCJSqlParserUtil.parse("insert into mytable (col1) values (1)");
System.out.println(insert.toString());

现在使用访问者模式添加新值的变体:

insert.getColumns().add(new Column("col2"));
insert.getItemsList().accept(new ItemsListVisitor() {

        public void visit(SubSelect subSelect) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void visit(ExpressionList expressionList) {
            expressionList.getExpressions().add(new LongValue(5));
        }

        public void visit(MultiExpressionList multiExprList) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
});
System.out.println(insert.toString());

但是使用访问者模式实现它有点过分。这是一个简单的解决方案:

insert.getColumns().add(new Column("col3"));
((ExpressionList)insert.getItemsList()).getExpressions().add(new LongValue(10));
System.out.println(insert.toString());

所以是的,可以修改JSQLParser的SQL层次结构。我正在使用JSQLParser 0.8.9 SNAPSHOT。正在进行修改以改善这种可修改性。