Java IncorrectResultSetColumnCountException:列计数不正确:应为1,实际为38

Java IncorrectResultSetColumnCountException:列计数不正确:应为1,实际为38,java,spring,jdbctemplate,Java,Spring,Jdbctemplate,我正在使用JdbcTemplate从数据库中检索Bean。以下是我的方法: public List<trackerv3Livedata> getTrackerData() { return List<trackerv3Livedata> live = (List<trackerv3Livedata>) jdbcTemplate.queryForList("select * from mmitrackerv3_livedata where accoun

我正在使用
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);
}
在我的场景中,我的查询完全可能没有命中,所以我的问题是如何绕过以下错误消息

org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 38
在我看来,我应该返回null,而不是抛出异常。我怎样才能解决这个问题?提前感谢。

应该尝试像使用API时一样使用它


希望这能解决您的问题。

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

public class Mmitrackerv3LivedataMapper implements RowMapper<Mmitrackerv3Livedata> {

@Override
public Mmitrackerv3Livedata mapRow(ResultSet rs, int rowNum)
        throws SQLException {
}
公共类Mmitrackerv3LivedataMapper实现行映射器{
@凌驾
公共Mmitrackerv3Livedata映射行(结果集rs,int rowNum)
抛出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());
List live=jdbcTemplate.query(“从mmitrackerv3_livedata mlive中选择*”+
“在mlive.accountid=mdevice.accountid,其中mlive.accountid=”上加入mmitrackerv3_设备mdevice”+
aid,新的Mmitrackerv3LivedataMapper());

感谢@abhishek

之所以发生这种情况,是因为您使用的queryForList方法不支持多列。请参阅JdbcTemplate中queryForList的实现

public <T> List<T> More ...queryForList(String sql, Object[] args, Class<T> elementType) throws DataAccessException 
{
    return query(sql, args, getSingleColumnRowMapper(elementType));
}
public List More…queryForList(字符串sql,对象[]args,类elementType)抛出DataAccessException
{
返回查询(sql、args、getSingleColumnRowMapper(elementType));
}
getsingleColumnRowMapper()方法创建一个新的行映射器,用于从单个列读取结果对象。 您可以使用下面给出的方法

public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException        
 {
    return query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper));
}
公共列表查询(字符串sql、对象[]参数、行映射器行映射器)引发DataAccessException
{
返回查询(sql、args、新的RowMapperResultSetExtractor(rowMapper));
}
JdbcTemplate方法

queryForList(字符串sql,类elementType)
对于单列查询非常有用,您只能指定列类型。如果在结果集中需要多个列,则使用更精确

查询(字符串sql、行映射器行映射器)
作为RowMapper的实现,您可以使用自己的,或者

jdbcTemplate.query(sql,新BeanPropertyRowMapper(clazz));
因此,在您的情况下,可能是:

公共列表getTrackerData(){
String sql=“从mmitrackerv3\u livedata mlive中选择*+
“在mlive.accountid=”上加入mmitrackerv3_设备mdevice”+
“mdevice.accountid,其中mlive.accountid=“+aid;
返回jdbcTemplate.query(sql,
新的BeanPropertyRowMapper(Trackerv3Livedata.class));
}
public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException        
 {
    return query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper));
}