上下文:
我的数据库中有很多表。我在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;
}
}
Base Entity只有一个id,因为我所有的表都有一个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中获取一种形式的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);
}
所以在道器中实际有问题的方法:
@Override
public Spravochnik selectOne(int spravochnikId, int rowId) {
return jdbctemplate.queryForObject(getQueryDinamicTable(SQL_SELECT_ROW, getSpravNameAtId(spravochnikId)),
new SpravochnikRowMapper(), rowId);
}
问题是,它适用于包含2列的表(id和另一个;我的所有表都满足这一点,除了一个),但是当我试图从只有3列的表中获取一行时,它说
org . spring framework . 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;
}
}
我在测试环境方面工作。
当我提交复制数据时,我出现了以下错误,这里是代码… 和DAO类。 这个错误来了,任何人都可以帮助解决这个问题。
我正在使用cassandra 3.11.11。它运行良好,但现在当我在下面运行查询时显示此错误。重要的是要说应用程序中没有任何变化。
这是我的DAO代码 这是我的控制器代码 这就是错误 消息请求处理失败;嵌套异常为org。springframework。道。IncorrectResultSizeDataAccessException:结果大小不正确:预期为1,实际为10
我使用Jdbctemplate从数据库中检索单个字符串值。以下是我的方法。 在我的场景中,查询完全可能不被击中,所以我的问题是如何绕过以下错误消息。 在我看来,我应该返回一个空值,而不是抛出一个异常。我怎么才能修好这个?提前谢了。
我已经构建了一个简单的登录页面,其中使用用户提供的用户名从数据库中获取所需的行,并根据用户提供的值检查凭据。 我面临的问题是,如果用户输入数据库中不存在的用户名值,我将面临此错误 org.springframework.dao.EmptyResultDataAccess异常: 不正确的结果大小: 预期的 1, 实际的 0 这意味着我的数据库没有任何具有所需用户名的行。 代码: 索引页: 用户道(其