Добавить операторы в SQL-запрос в jsqlparser

Мне было интересно, если можно добавить выражение в запрос SQL с помощью jsqlparser. Например, я хотел бы добавить столбец и значение в оператор SQL:

Оригинальный запрос: "INSERT INTO frontend(in_reply_to) ЦЕННОСТИ (email);"

модифицированный запрос: "INSERT INTO frontend(in_reply_to, user_id) ЦЕННОСТИ (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 ответ

Я знаю немного поздно. Но здесь есть решение. Сначала мы создаем оператор тестовой вставки:

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

Так что да, можно изменить иерархию SQL JSQLParser. Я использую JSQLParser 0.8.9 SNAPSHOT. Идут модификации, чтобы улучшить эту модифицируемость.

Другие вопросы по тегам