Java IncorrectResultSetColumnCountException: 不正确的列数:预期为 1,实际为 38

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33008205/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 14:08:56  来源:igfitidea点击:

IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 38

javaspringjdbctemplate

提问by

I am using JdbcTemplateto retrieve a Bean from the db. Here is my method:

我正在使用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);
}

And trackerv3Livedata bean Structure Are Following:

和 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 */
}

In my scenario it is complete possible to NOT get a hit on my query so my question is how do I get around the following error message.

在我的情况下,完全有可能不会在我的查询中得到命中,所以我的问题是如何解决以下错误消息。

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

It would seem to me that I should just get back a null instead of throwing an exception. How can I fix this? Thanks in advance.

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

回答by AbhishekAsh

Should try using Rowmapperlike use it as when you queryAPI.

应该尝试使用Rowmapper,就像在查询API时一样使用它。

Hope that solves your problem.

希望能解决您的问题。

回答by AbhishekAsh

Implementing Bean RowMapper Interface and maprow function solve this problem

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

public class Mmitrackerv3LivedataMapper implements RowMapper<Mmitrackerv3Livedata> {

@Override
public Mmitrackerv3Livedata mapRow(ResultSet rs, int rowNum)
        throws SQLException {
}

And Now I have Change In JDBC Template

现在我改变了 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());

Thanks @abhishek

谢谢@abhishek

回答by ajith george

This is happening because, the queryForList method you have used will not support for multiple columns. See the implementation of queryForList from JdbcTemplate

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

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

The getsingleColumnRowMapper() method creates a new RowMapper for reading result objects from a single column. You can use the method given below instead.

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

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

回答by Drakonoved

JdbcTemplate method

JdbcTemplate 方法

queryForList(String sql, Class<T> elementType)

is useful for one-column-queries, you may only specify the column type. If you need more than one column in ResultSet, it's more accurate to use

one-column-queries很有用,您只能指定列类型。如果ResultSet中需要多于一列,使用更准确

query(String sql, RowMapper<T> rowMapper)

as implementation for RowMapper you may use your own, or

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

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

so in your case it may be:

所以在你的情况下可能是:

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));
}