我正在扫描hbase中的md5字符串,如果找到了字符串,我必须执行一些操作。 问题是,如果我第一次检查它,它返回true(并且log是值),但是,当我在if或for语句中使用相同的表达式时,我得到了错误的结果。
Scan scanCookiesData = new Scan();
scanCookiesData.addColumn(Bytes.toBytes("md5data"), Bytes.toBytes("md5data"));
ResultScanner scannerCookiesData = dbHelper.getTable("userInfo").getScanner(scanCookiesData);
if (scannerCookiesData.next() != null) {
response.getWriter().println("if (scannerCookiesData.next() != null)");
for (Result r = scannerCookiesData.next(); r != null; r = scannerCookiesData.next()) {
response.getWriter().println("INSIDE FOR!!!");
if (md5data.equals(Bytes.toString(r.value()))) {
// Here we will assign ID to the user.
response.getWriter().println(assignID(Bytes.toString(r.value())));
response.setStatus(200);
} else {
response.getWriter().println("ELSE");
}
}
} else {
response.getWriter().println(createNewUser(json));
response.setStatus(200);
}
在这段代码中,首先如果它变为“true”,但in for未被调用,因为它将显示“false”..但是scan不是null(在db中是md5字符串),所以应该得到“真实”..
答案 0 :(得分:1)
我现在能够想到的最好的原因是您的查询只找到了1个结果。错误就是因为误解了你身边的next()
:该调用会返回下一个值(如果存在)并向前移动一步,无法返回返回
通过调用if (scannerCookiesData.next() != null)
,您实际检索到该结果,然后跳到下一个(如果存在)。
这意味着您从未实际使用过您的第一个结果,除了空检查,因为它无处存储。到达for
循环时,您将开始使用第二个结果,我认为在您的情况下不存在。
如果没有找到扫描程序的进一步结果,将返回null
而不是Result
对象,表示结果集的结束。