就我而言,我使用PreparedStatement
从我的数据库中选择记录:
选择的行数是正确的,但只显示最后一行。
我的代码:
while (rs.next()) {
DetailCaisse detailCaisse = new DetailCaisse();
devise.setLibSiglDev(rs.getString("LIB_DEV_DEV"));
devise.setLibSiglDev(rs.getString("LIB_SIGL_DEV"));
devise.setCodDevDev(rs.getInt("cod_Dev_dev"));
detailCaisse.setDevise(devise);
deviseDispo.add(detailCaisse);
}
我应该使用什么代替while(rs.next())
来解决问题?
答案 0 :(得分:8)
您对while(rs.next())
的使用没有任何问题。问题是您使用新值覆盖相同的devise
实例,从而丢失旧的实例。相反,您应该在每次迭代时创建一个新实例:
while (rs.next()) {
DetailCaisse detailCaisse = new DetailCaisse();
Devise devise = new Devise(); // Here!
devise.setLibSiglDev(rs.getString("LIB_DEV_DEV"));
devise.setLibSiglDev(rs.getString("LIB_SIGL_DEV"));
devise.setCodDevDev(rs.getInt("cod_Dev_dev"));
detailCaisse.setDevise(devise);
deviseDispo.add(detailCaisse);
}
答案 1 :(得分:2)
您的代码的某些部分缺失,以便100%告诉您问题是什么,但似乎您在devise
循环之前声明while
,而不是覆盖每个部分的值迭代。
这就是你有3个结果的原因,但它们都是一样的。
另请注意,您使用2个不同的值覆盖循环内的setLibSiglDev
,它只会使用LIB_SIGL_DEV
。
答案 2 :(得分:2)
detailCaisse.setDevise(devise);
每次迭代都采用相同的引用但每次迭代都会更改参考值的问题,因此显示迭代值,每次迭代都应该进行新的new Devise();
。
答案 3 :(得分:-3)
选择的行数是正确的,但只显示最后一行。
你不能双管齐下。您是否正确计算了所有行,或者您没有。你这样做了,除非while (rs.next())
工作正常,否则你无法获得正确的计数, ergo while (rs.next())
是正确的代码。
显然,其他地方出现了问题。