【问题标题】:Postgresql update - Using ArrayListPostgresql 更新 - 使用 ArrayList
【发布时间】:2015-11-28 14:51:47
【问题描述】:

我在更新 postgres 时遇到异常: org.postgresql.util.PSQLException: 无法推断 SQL 类型...

这是我动态构建 sql 语句并附加参数的代码:

public Boolean update(UserData usrData){
    String sqlUpdateUser = "UPDATE \"USER\" ";
    String sqlSetValues = "SET";
    String sqlCondition = "Where \"USER_ID\" = ? ";

    List<Object> params = new ArrayList<Object>();
    List<Integer> types = new ArrayList<Integer>();

    if(usrData.getFirstName() != null){
        sqlSetValues = sqlSetValues.concat(" \"FIRST_NAME\" = ? ").concat(", ");
        params.add(usrData.getFirstName());
        types.add(Types.VARCHAR);

    }

    if(usrData.getMiddleName() != null){
        sqlSetValues = sqlSetValues.concat("\"MIDDLE_NAME\" = ? ");
        params.add(usrData.getMiddleName());
        types.add(Types.VARCHAR);
    }

    params.add(usrData.getUserId());
    types.add(Types.BIGINT);

    Object[] updateParams = new Object[params.size()];
    updateParams = params.toArray(updateParams);

    Integer[] paramTypes = new Integer[types.size()];
    paramTypes = types.toArray(paramTypes);


    sqlUpdateUser = sqlUpdateUser.concat(sqlSetValues).concat(sqlCondition);
    int rowsAffected = this.jdbcTemplate.update(sqlUpdateUser, updateParams, paramTypes);

    if(rowsAffected > 0){
        return Boolean.TRUE;
    }else{
        return Boolean.FALSE;
    }

}

USER 表的表模式是:

"FIRST_NAME" character varying(50),
"MIDDLE_NAME" character varying(50),

如果我在不使用集合但使用数组的情况下进行静态更新,我认为没有问题。 使用数组截取的代码:

Object[] param = { usrData.getFirstName(), usrData.getMiddleName(), usrData.getUserId() };
int[] type = { Types.VARCHAR, Types.VARCHAR, Types.BIGINT };
int rowsAffected = this.jdbcTemplate.update(sqlUpdateUser, param, type);

我错过了什么吗?

谢谢 克

【问题讨论】:

    标签: postgresql jdbc


    【解决方案1】:

    移动这些行

        Object[] updateParams = new Object[params.size()];
        updateParams = params.toArray(updateParams);
    
        Integer[] paramTypes = new Integer[types.size()];
        paramTypes = types.toArray(paramTypes);
    

    下面

        params.add(usrData.getUserId());
        types.add(Types.INTEGER);
    

    在您的情况下,您缺少在 updateParams 中添加 usrData.getUserId()。

    【讨论】:

    • 你能检查一下在这一行中传递的 sqlUpdateUser 、 updateParams 、 paramTyoes 的确切值吗 - int rowsAffected = this.jdbcTemplate.update(sqlUpdateUser, updateParams, paramTypes);
    • 我检查了这些 - UpdateParams 值:n_update4 | G_update4 | 66 和对应的 ParamTypes 值 12 | 12 | -5 .. 这些值在作为普通数组传递时和作为从 ArrayList 创建的数组传递时是相同的.....所以有了这个问题,我被困在如何动态构造更新语句..
    • 你能粘贴整个堆栈跟踪吗..它将显示发生转换异常的位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2021-02-20
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多