2

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);
4

1 に答える 1

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 を使用しています。この変更可能性を改善するための変更が進行中です。

于 2014-02-05T23:09:51.953 に答える