java - 在jsqlparser中向sql查询添加语句

标签 java sql sql-parser

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

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

修改后的查询:“INSERT INTO frontend(in_reply_to, user_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);

最佳答案

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

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 快照。正在进行修改以提高这种可修改性。

关于java - 在jsqlparser中向sql查询添加语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11507469/

相关文章:

sql - 为什么 UDF 比子查询慢这么多?

sql - 如果一列满足条件,如何选择一行,如果不满足,则选择另一列? [ Access 2010]

python - 将 SQL 查询解析为类似 DOM 的树以启用自动排列?

java - 如何用spring正确发布DDD领域事件?

java - 获取列名以及 JSON 响应

java - 找不到符号 Java 多维数组

mysql - 检查如何进行,我遇到问题

java - 如何在 hibernate 中知道父实体中是否加载了子实体

用于解析 mysql 创建查询并与现有表进行区分的 PHP 库

php - ReplaceProcessor::process($tokenList) 的声明必须与 InsertProcessor::process($tokenList, $token_category = 'INSERT' ) 兼容