java - 当我按 ID 获取一行时,如何修复“不正确的结果大小:预期 1,实际 0”?
问题描述
语境:
我的数据库中有很多表。我在 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;
}
}
基本实体只有一个 id,因为我的所有表都有一个,这里是所有其他字段(列名)和所有按行插入的值(行中的值是一行中的值列表,包含在另一个列表中以获取列表行,而每行都是其中的值列表)。我也有一个行映射器:
public class SpravochnikRowMapper implements RowMapper<Spravochnik> {
@Override
public Spravochnik mapRow(ResultSet rs, int arg1) throws SQLException {
Spravochnik spr = new Spravochnik();
ResultSetMetaData rsmeta = rs.getMetaData();
List<String> columnNames = new ArrayList<>();
List<List<String>> valuesInRows = new ArrayList<List<String>>();
int columnCount = rsmeta.getColumnCount();
for(int column = 1; column <= columnCount; column++){
columnNames.add(rsmeta.getColumnName(column));
}
spr.setColumnName(columnNames);
do {
List<String> values = new ArrayList<>();
for(int column = 1; column <= columnCount; column++){
values.add(rs.getString(column));
}
valuesInRows.add(values);
}while(rs.next());
spr.setValuesInRows(valuesInRows);
return spr;
}
}
所以,我有一种方法可以根据它的 id 获取一行(是的,起初我从另一个获取一种形式的 id,但它并不那么重要):
@Override
public Spravochnik selectOne(String id) {
return spravochnikDao.selectOne(getSpravId(id), getRowId(id) );
}
protected int getSpravId(String id) {
return Integer.valueOf(id.substring(0, 3));
}
protected int getRowId(String id) {
return Integer.valueOf(id);
}
实际有问题的方法 ,所以在 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
将为可用的每一行调用该方法。因此,做 ars.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;
}
}
推荐阅读
- git - 使用融合的 git 三向差异
- android - 谷歌附近的连接限制到听距?
- cocoa - 没有标题栏的浮动窗口不会转到屏幕顶部
- reactjs - 通过 Reactjs(使用 JSX)“更新时钟”
- spring-boot - 是否可以避免 OneToMany-ManyToOne 双向关系中的递归和 StackOverflowError?
- azure - 使用设备配置服务在 azure iot hub 中创建用于创建设备的 HTTP 请求的问题
- python - Python泡菜问题
- reactjs - 调度另一个动作/在减速器中调用另一个减速器
- php - 如果 SELECT 查询后 SQL 中不存在行,如何显示错误消息?
- timestamp - Googlescript逐行更新时间戳