jdbcTemplate.batchUpdate,BatchPreparedStatementSetter

问题描述

我有一种用于重命名表中字段的方法。它为每个字段执行一个单独的查询

private final StringBuilder sql = new StringBuilder();

public void editNameFields(Map<String,String> fields,String naMetable) {
    
        fields.forEach((name,newName) ->{sql.delete(0,sql.length());
                        sql.append("ALTER TABLE ").append(naMetable).append(" RENAME COLUMN ");
                                        sql.append(EDIT_NAME_FIELDS).append(name).append(" to ").append(newName);
                                        jdbcTemplate.execute(String.valueOf(sql));});

但是我想使用Batch PreparedStatementSetter来准备一批查询重命名表字段。 Map 中的传入数据包含 { “ name”:“名字”, “ lastname”:“ secondName” }

我可以通过调试器看到请求文本的格式正确 但是结果我得到了一个错误。 为什么?

路径为[/ sb]的上下文中的servlet [dispatcherServlet]的

Servlet.service()引发异常[请求处理失败;嵌套的异常是org.springframework.jdbc.BadsqlGrammarException:PreparedStatementCallback;错误sql语法[ALTER TABLE人员RENAME COLUMN吗?至 ?];嵌套的异常是org.postgresql.util.PsqlException:ERROR:语法错误(大约位置:“ $ 1”) 位置:34],其根本原因是

public int[] batchEditUsingJdbcTemplate(Map<String,String> fields) {

        int[] count= jdbcTemplate.batchUpdate("ALTER TABLE person RENAME COLUMN ? to ?",new BatchPreparedStatementSetter() {
                    @Override
                    public void setValues(PreparedStatement ps,int i) {
                            fields.forEach((name,newName) -> {
                                try {
                                    ps.setString(1,name);
                                } catch (sqlException throwables) {
                                    throwables.printstacktrace();
                                }
                                try {
                                    ps.setString(2,newName);
                                } catch (sqlException throwables) {
                                    throwables.printstacktrace();
                                }
                            });

                    }

                    @Override
                    public int getBatchSize() {
                        return fields.size();
                    }
                });
        return count;
    }

我使用没有实体的数据库中的表。原因:表是动态创建的,结构是在REST请求中接收的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)