Java 如何修复';结果大小不正确:预期为1,实际为0';我什么时候按ID取一行?

Java 如何修复';结果大小不正确:预期为1,实际为0';我什么时候按ID取一行?,java,sql,spring,jdbctemplate,Java,Sql,Spring,Jdbctemplate,上下文: 我的数据库中有很多表。我在java中没有显式的实体类,而是在一个特殊的类中存储关于列和值的信息,如下所示: public class Spravochnik extends BaseEntity { private List<String> columnName; private List<List<String>> valuesInRows; public List<String> getColumnName

上下文:

我的数据库中有很多表。我在java中没有显式的实体类,而是在一个特殊的类中存储关于列和值的信息,如下所示:

public class Spravochnik extends BaseEntity {  
    private List<String> columnName;
    private List<List<String>> valuesInRows;
    public List<String> getColumnName() {
        return columnName;
    }
    public void setColumnName(List<String> columnName) {
        this.columnName = columnName;
    }
    public List<List<String>> getValuesInRows() {
        return valuesInRows;
    }
    public void setValuesInRows(List<List<String>> valuesInRows) {
        this.valuesInRows = valuesInRows;
    }   
}
实际有问题的方法 因此,在dao中实现:

    @Override
    public Spravochnik selectOne(int spravochnikId, int rowId) {
        return jdbctemplate.queryForObject(getQueryDinamicTable(SQL_SELECT_ROW, getSpravNameAtId(spravochnikId)),
                new SpravochnikRowMapper(), rowId);
    }
问题是,对于包含2列的表(id和另一列;我所有的表中只有一个满足这个要求),它工作得非常好,但是当我试图从唯一一个包含3列的表中获取一行时,它说

org.springframework.dao.EmptyResultDataAccessException:结果大小不正确:预期为1,实际为0”。同样,当我从一个包含2列的表中获取一行时,它可以正常工作,而不是从包含3列的表中获取一行时。我猜问题可能是在rowmapper中,也可能是在方法本身中。如果您需要更多信息,请随时询问并提前感谢大家


将为每个可用行调用
mapRow
方法。因此,执行
rs.next()
不是一个好做法。您可以像下面这样重写映射程序:

public class SpravochnikRowMapper implements RowMapper<Spravochnik> {

    private List<String> columnNames;
    private int columnCount;

    @Override
    public Spravochnik mapRow(ResultSet rs, int arg1) throws SQLException {
        Spravochnik spr = new Spravochnik();
        if (columnNames == null) {
            ResultSetMetaData rsmeta = rs.getMetaData();
            columnNames = new ArrayList<>();
            columnCount = rsmeta.getColumnCount();
            for(int column = 1; column <= columnCount; column++){
                columnNames.add(rsmeta.getColumnName(column));
            }

        }

        List<List<String>> valuesInRows = new ArrayList<List<String>>();
        spr.setColumnName(columnNames);

        List<String> values = new ArrayList<>();
        for(int column = 1; column <= columnCount; column++){
            values.add(rs.getString(column));
        }

        valuesInRows.add(values);
        spr.setValuesInRows(valuesInRows);
        return spr;
    }
}
公共类SpravochnikRowMapper实现了RowMapper{
列名;
私有int列计数;
@凌驾
公共Spravochnik映射行(结果集rs,int arg1)引发SQLException{
Spravochnik spr=新Spravochnik();
如果(columnNames==null){
ResultSetMetaData rsmeta=rs.getMetaData();
columnNames=新的ArrayList();
columnCount=rsmeta.getColumnCount();

对于(int column=1;column感谢您的建议!它在我的3列表上的行为仍然相同…请共享-getQueryDinamicTableprotected String getQueryDinamicTable(String query,String tableName){return query.replace(SQL_RPL_table_NAME,tableName).intern()的返回值谢谢,我已经解决了这个问题,结果表明,发出警告的原因不是一个错误的行映射器,而是sql表和这个特定表的数据设置结构中的一个输入错误
    @Override
    public Spravochnik selectOne(int spravochnikId, int rowId) {
        return jdbctemplate.queryForObject(getQueryDinamicTable(SQL_SELECT_ROW, getSpravNameAtId(spravochnikId)),
                new SpravochnikRowMapper(), rowId);
    }
public class SpravochnikRowMapper implements RowMapper<Spravochnik> {

    private List<String> columnNames;
    private int columnCount;

    @Override
    public Spravochnik mapRow(ResultSet rs, int arg1) throws SQLException {
        Spravochnik spr = new Spravochnik();
        if (columnNames == null) {
            ResultSetMetaData rsmeta = rs.getMetaData();
            columnNames = new ArrayList<>();
            columnCount = rsmeta.getColumnCount();
            for(int column = 1; column <= columnCount; column++){
                columnNames.add(rsmeta.getColumnName(column));
            }

        }

        List<List<String>> valuesInRows = new ArrayList<List<String>>();
        spr.setColumnName(columnNames);

        List<String> values = new ArrayList<>();
        for(int column = 1; column <= columnCount; column++){
            values.add(rs.getString(column));
        }

        valuesInRows.add(values);
        spr.setValuesInRows(valuesInRows);
        return spr;
    }
}