Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jsqlparser中将语句添加到sql查询_Java_Sql_Sql Parser - Fatal编程技术网

Java 在jsqlparser中将语句添加到sql查询

Java 在jsqlparser中将语句添加到sql查询,java,sql,sql-parser,Java,Sql,Sql Parser,我想知道是否可以使用jsqlparser向sql查询添加表达式。例如,我想向sql语句添加一列和一个值: Insert insert = (Insert)CCJSqlParserUtil.parse("insert into mytable (col1) values (1)"); System.out.println(insert.toString()); 原始查询:“插入到前端(在答复中)值(电子邮件) 修改的查询:“插入到前端(在答复中,用户id)值(电子邮件,123)” 我设法修改了一

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

Insert insert = (Insert)CCJSqlParserUtil.parse("insert into mytable (col1) values (1)");
System.out.println(insert.toString());
原始查询:“插入到<代码>前端(
在答复中
)值(
电子邮件

修改的查询:“插入到
前端
在答复中,
用户id
)值(
电子邮件
,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快照。正在进行修改以改进此可修改性。

当我为您拥有的较短版本测试类似的实现时,抛出了一个ClassCastException-“net.sf.jsqlparser.expression.operators.conditional.AndExpression无法强制转换为net.sf.jsqlparser.expression.operators.relational.ExpressionList”。我认为紧凑型不是最合适的。注意:我是第一次使用这个库,可能没有深入理解它。我的SQL是:updatemytable SET COL1=CURRENT_TIMESTAMP,COL2=some_value,其中ID=22331,PARENT=11220;短版本仅用于插入。您必须修改它以进行更新。