【问题标题】:IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 38IncorrectResultSetColumnCountException:不正确的列数:预期为 1,实际为 38
【发布时间】:2016-01-05 15:04:13
【问题描述】:

我正在使用JdbcTemplate 从数据库中检索 Bean。这是我的方法:

public List<trackerv3Livedata>  getTrackerData() {
    return List<trackerv3Livedata> live = (List<trackerv3Livedata>) jdbcTemplate.queryForList("select * from mmitrackerv3_livedata where accountid =?",new Object[]{aid}, trackerv3Livedata.class);
}

并且trackerv3Livedata bean结构如下:

public class trackerv3Livedata implements Serializable {

    private static final long serialVersionUID = 2409168269491619888L;

    private int deviceid;
    private Long timestamp;
    private Mmitrackerv3Device mmitrackerv3Device;
    private Mmitrackerv3Account mmitrackerv3Account;
    private double latitude;
    private double longitude;
    private Double altitude;
    private Double speedkph;
    private Double heading;
    private Double gpssignal;
    private Integer geozoneid;
    private Double distancekm;
    private Double gsmsignal;
    private Double mainpower;
    private Integer laststatustime;
    private Double internalbattry;
    private Double temperature;
    private Short dinput1;
    private Short dinput2;
    private Short dinput3;
    private Short dinput4;
    private Short dinput5;
    private Short dinput6;
    private Short dinput7;
    private Short dinput8;
    private Short ainput1;
    private Short ainput2;
    private Short ainput3;
    private Short ainput4;
    private Short doutput1;
    private Short doutput2;
    private Short doutput3;
    private Short doutput4;

    /* There are Some Getter And Setter Method With Constructor */
}

在我的情况下,我的查询完全有可能不会被点击,所以我的问题是如何绕过以下错误消息。

org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 38

在我看来,我应该只返回一个 null 而不是抛出异常。我怎样才能解决这个问题?提前致谢。

【问题讨论】:

    标签: java spring jdbctemplate


    【解决方案1】:

    JdbcTemplate 方法

    queryForList(String sql, Class<T> elementType)
    

    对于单列查询很有用,您只能指定列类型。如果ResultSet中需要多列,使用更准确

    query(String sql, RowMapper<T> rowMapper)
    

    作为 RowMapper 的实现,您可以使用自己的,或者

    jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(clazz));
    

    所以你的情况可能是:

    public List<Trackerv3Livedata> getTrackerData() {
        String sql = "SELECT * FROM mmitrackerv3_livedata mlive " +
                     "JOIN mmitrackerv3_device mdevice ON mlive.accountid = " +
                     "mdevice.accountid WHERE mlive.accountid = " + aid;
    
        return jdbcTemplate.query(sql,
            new BeanPropertyRowMapper<Trackerv3Livedata>(Trackerv3Livedata.class));
    }
    

    【讨论】:

      【解决方案2】:

      发生这种情况是因为,您使用的 queryForList 方法不支持多列。从 JdbcTemplate 看 queryForList 的实现

      public <T> List<T> More ...queryForList(String sql, Object[] args, Class<T> elementType) throws DataAccessException 
      {
          return query(sql, args, getSingleColumnRowMapper(elementType));
      }
      

      getsingleColumnRowMapper() 方法创建一个新的 RowMapper 用于从单个列中读取结果对象。 您可以改用下面给出的方法。

      public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException        
       {
          return query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper));
      }
      

      【讨论】:

        【解决方案3】:

        实现Bean RowMapper接口和maprow函数解决这个问题

        public class Mmitrackerv3LivedataMapper implements RowMapper<Mmitrackerv3Livedata> {
        
        @Override
        public Mmitrackerv3Livedata mapRow(ResultSet rs, int rowNum)
                throws SQLException {
        }
        

        现在我对 JDBC 模板进行了更改

         List<Mmitrackerv3Livedata> live = jdbcTemplate.query("select * from mmitrackerv3_livedata mlive " + 
         "join mmitrackerv3_device mdevice on mlive.accountid = mdevice.accountid where mlive.accountid = " +
             aid, new Mmitrackerv3LivedataMapper());
        

        谢谢@abhishek

        【讨论】:

          【解决方案4】:

          应该尝试使用Rowmapper,就像使用query API 时一样。

          希望能解决您的问题。

          【讨论】:

            猜你喜欢
            • 2015-03-13
            • 2015-04-24
            • 2017-06-02
            • 1970-01-01
            • 2012-05-23
            • 1970-01-01
            • 1970-01-01
            • 2014-04-25
            • 1970-01-01
            相关资源
            最近更新 更多