ResultSet读取数据时丢失第一条空白记录的问题求助
解决ResultSet游标丢失第一条记录的问题
这个问题的核心就是游标移动的逻辑冲突——你在前置判断里调用的result.next()已经把游标定位到了第一条记录,但没对这条数据做任何处理,之后的while (result.next())又会从第二条记录开始遍历,自然就丢失了你需要保留的空白首项。
给你两种靠谱的解决方案,都能兼顾「空结果集判断」和「保留第一条空白记录」的需求:
方案1:用isBeforeFirst()做无侵入式检查
isBeforeFirst()方法不会移动游标,只是判断结果集是否有数据(游标是否在第一条记录之前),完美替代你原来的next()判断:
ArrayList<MyClass> list = new ArrayList<>(); // 检查是否存在任何记录,不移动游标 if (!result.isBeforeFirst()) { throw new RuntimeException("没有找到任何记录"); } // 先处理第一条记录(包括空白项) addRecordToList(result, list); // 遍历剩下的所有记录 while (result.next()) { addRecordToList(result, list); }
这里的addRecordToList就是你原来用来填充ArrayList的逻辑,比如读取字段值、创建MyClass实例加入列表。
方案2:先遍历再判断是否有记录
这种写法更简洁,直接用循环处理所有记录,最后用标记判断是否为空:
ArrayList<MyClass> list = new ArrayList<>(); boolean hasRecords = false; // 一次性遍历所有记录,包括第一条空白项 while (result.next()) { hasRecords = true; addRecordToList(result, list); } // 遍历结束后判断是否没有任何记录 if (!hasRecords) { throw new RuntimeException("没有找到任何记录"); }
这种方式不需要额外处理第一条记录,循环会自动把所有记录(包括空白首项)都加入列表,最后再检查是否空结果集。
为什么原来的代码会出问题?
你原来的if (!result.next())逻辑是:如果调用next()返回false(说明没有记录)就抛异常,但如果有记录,next()已经把游标移到了第一条记录,此时你没把这条记录加入列表,之后进入while (result.next()),游标会直接跳到第二条记录,第一条就这样被跳过了。
内容的提问来源于stack exchange,提问作者achAmháin
相关产品推荐
相关产品推荐

