Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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 Spring getJdbcTemplate()。更新插入动态对象_Java_Sql_Spring_Postgresql_Spring Mvc - Fatal编程技术网

Java Spring getJdbcTemplate()。更新插入动态对象

Java Spring getJdbcTemplate()。更新插入动态对象,java,sql,spring,postgresql,spring-mvc,Java,Sql,Spring,Postgresql,Spring Mvc,我以前从未遇到过这样的问题,谷歌帮不上忙 我使用Spring框架,JdbcDaoSupport,getJdbcTemplate().update()方法。 我有一个带有2个可选参数的动态查询 不知道输入动态对象的正确方法。 我就是这样尝试的: StringBuilder sbUserRegQuery = new StringBuilder(); sbUserRegQuery.append("INSERT INTO users (username, password , email

我以前从未遇到过这样的问题,谷歌帮不上忙

我使用Spring框架,
JdbcDaoSupport
getJdbcTemplate().update()
方法。 我有一个带有2个可选参数的动态查询

不知道输入动态对象的正确方法。 我就是这样尝试的:

    StringBuilder sbUserRegQuery = new StringBuilder();
    sbUserRegQuery.append("INSERT INTO users (username, password , email, enabled, datetime_condo_changed, datetime_last_login");
    if(user.getCondo_id()!=null) sbUserRegQuery.append(", condo_id");
    if(user.getProvider()!=null) sbUserRegQuery.append(", provider");
    sbUserRegQuery.append(")");
    sbUserRegQuery.append(" VALUES ( ?, ?, ? , ? , ?, ?");
    if(user.getCondo_id()!=null) sbUserRegQuery.append(", ?");
    if(user.getProvider()!=null) sbUserRegQuery.append(", ?"); //default - "local"
    sbUserRegQuery.append(");");

        Object regObject = new Object[]{
            user.getUsername(), PasswordEncoderGenerator.main(user.getPassword()), user.getEmail(), enabled, user.getDatetime_condo_changed(), currentTimeStamp, user.getCondo_id()
        };

       int row = getJdbcTemplate().update(sbUserRegQuery.toString(), regObject, user.getCondo_id(), user.getProvider());
i、 e.我试图在
regObject
之后插入动态对象。 但是,在这种情况下,可以更改动态对象的顺序,并且查询失败


如何解决这个问题?

您得到的错误是什么


jdbcTemplate API中没有包含四个参数的更新方法。您提到的是四个参数。

我不确定我的解决方案是否适合您的问题,但在我的项目中,我使用了如下“插入”结构:

public void insert(User u) {
    final String sql = "insert into user(firstName, lastName, email, password) values(?,?,?,?)";

    final String firstName = u.getFirstName();
    final String lastName = u.getLastName();
    final String email = u.getEmail();
    final String password = u.getPassword();

    jdbcTemplate.update(new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(
                Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement(sql,
                    new String[] { "id" });
            ps.setString(1, firstName);
            ps.setString(2, lastName);
            ps.setString(3, email);
            ps.setString(4, password);
            return ps;
        }
    }, idHolder);

通过在创建SQL时使用条件检查,您几乎可以做到这一点,但是对于传递到update()方法中的变量参数,您不会这样做

StringBuilder sbUserRegQuery=new StringBuilder();
追加(“插入到用户中(用户名、密码、电子邮件、已启用、datetime\u condo\u更改、datetime\u上次登录”);
if(user.getCondo_id()!=null)sbUserRegQuery.append(“,condo_id”);
if(user.getProvider()!=null)sbUserRegQuery.append(“,provider”);
sbUserRegQuery.append(“)”;
追加(“值(?,,,,,,,,?”;
if(user.getCondo_id()!=null)sbUserRegQuery.append(“,?”);
如果(user.getProvider()!=null)sbUserRegQuery.append(“,?”);
sbUserRegQuery.append(“);”;
ArrayList params=新的ArrayList();
params.add(user.getUsername());
add(PasswordEncoderGenerator.main(user.getPassword());
params.add(user.getEmail());
参数添加(已启用);
params.add(user.getDatetime_condo_changed());
参数添加(当前时间戳);
if(user.getCondo_id()!=null)params.add(user.getCondo_id());
if(user.getProvider()!=null)params.add(user.getProvider());
int row=getJdbcTemplate().update(sbUserRegQuery.toString(),params.toArray());

您在控制台中遇到了什么错误?你最好把它贴在这里。
我建议你改变这一点:

    Object regObject = new Object[]{
        user.getUsername(), PasswordEncoderGenerator.main(user.getPassword()), user.getEmail(), enabled, user.getDatetime_condo_changed(), currentTimeStamp, user.getCondo_id()
    };


   int row = getJdbcTemplate().update(sbUserRegQuery.toString(), regObject, user.getCondo_id(), user.getProvider());
致:


请参阅无效值,因为“condo_id”和“provider”的位置是动态的
    Object regObject = new Object[]{
        user.getUsername(), PasswordEncoderGenerator.main(user.getPassword()), user.getEmail(), enabled, user.getDatetime_condo_changed(), currentTimeStamp, user.getCondo_id()
    };


   int row = getJdbcTemplate().update(sbUserRegQuery.toString(), regObject, user.getCondo_id(), user.getProvider());
int row = getJdbcTemplate().update(
                    sbUserRegQuery,
                    user.getUsername(),
                    user.getPassword(),
                    user.getEmail(),
                    enabled,
                    user.getDatetime_condo_changed(),
                    currentTimeStamp,
                    user.getCondo_id(),
                    user.getCondo_id(),
                    user.getProvider()
);