【问题标题】:Spring Boot - no such column exceptionSpring Boot - 没有这样的列异常
【发布时间】:2016-08-25 07:24:54
【问题描述】:

我正在编写一个 Spring Batch / Boot 应用程序来将数据从 informix DB 提取到 java 数据对象,但我无法弄清楚 java.sql.SQLException:没有这样的列名问题。

这是方法:

    public UserDo getUserAddress(UserDo item) {
    try {
        myJdbcTemplate.queryForObject(getUserAddressQuery, new RowMapper<UserDo>() {
            @Override
            public UserDo mapRow(ResultSet rs, int arg1) throws SQLException {
                try {
                    item.setAddressLine1(rs.getString("cad_add_line_1")); 
                    item.setAddressLine2(rs.getString("cad_add_line_2" + "cad_add_line_3" + "cad_add_line_4"));
                    item.setCity(rs.getString("cad_city_name"));
                    item.setState(rs.getString("cad_ste_prv_cd"));
                    item.setZip(rs.getString("cad_postal_code" + "cad_postal_cd_4"));
                    item.setCountry(rs.getString("cad_country_code"));
                } catch (SQLException sqle){
                    logger.error(sqle.getMessage(), sqle);
                }
                return item;
            }
        }, item.getUserId());
    } catch (EmptyResultDataAccessException erdae) {
        logger.error(erdae.getMessage(), erdae);
    } catch (IncorrectResultSizeDataAccessException irsdae) {
        logger.error(irsdae.getMessage(), irsdae);
    }
    return item;
}

这是JdbcTemplate正在执行的查询:

    private final String getUserAddressQuery = "select cad_add_line_1, cad_add_line_2, cad_add_line_3, cad_add_line_4, cad_city_name, cad_ste_prv_cd, cad_postal_code, cad_postal_cd_4, cad_country_code, cad_county_parrish "
        + "from user_address "
        + "where user_id = ? "
        + "and user_type_code = '03' ";

表格列值都是CHAR 类型,列大小从335

数据对象属性都是字符串类型。

这个方法是从我的ItemProcessor调用的。

ResultSet 使用调试器时对象似乎为空。我认为问题在于从informix CHAR 读取到Java String。这是因为另一种方法做同样的事情,除了从informix INTEGER 读取到Java int 之外,效果很好。

请帮忙。

【问题讨论】:

    标签: java spring jdbc spring-batch informix


    【解决方案1】:

    您的问题在这里:

    rs.getString("cad_add_line_2" + "cad_add_line_3" + "cad_add_line_4")
    

    这将编译为:

    rs.getString("cad_add_line_2cad_add_line_3cad_add_line_4")
    

    我强烈怀疑不存在这样的专栏。


    你的意思是:

    rs.getString("cad_add_line_2")
    + rs.getString("cad_add_line_3")
    + rs.getString("cad_add_line_4")
    

    你也有同样的问题:

    rs.getString("cad_postal_code" + "cad_postal_cd_4")
    

    【讨论】:

    • 谢谢先生。我会尽快接受你的回答。如果您不介意我问另一个问题,我是如何在此方法中使用/设置项目对象的好吗?这修复了错误,但它仍然没有被写入文件,所以我认为这些更改并没有返回到将项目传递给写入器的项目处理器。
    • 不是,不是。你传入一个item。然后在myJdbcTemplate.queryForObject 方法中改变item,并忽略返回值。然后您返回相同的item。这一切都非常混乱。我认为您需要真正考虑该方法接收到的对象,变异的对象以及返回的对象。我建议重写方法以接受int userId,然后接受return myJdbcTemplate.queryForObject
    • 再次正确。使用创建新的 DO 将它们传回并在调用方法中重新初始化以返回对象是有效的。需要考虑只是通过 int 但我很感激这个建议。池塘对面的晚安。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2015-04-21
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多