JAVA中查询FilreredRowSet的谓词实现
我有以下谓词实现:JAVA中查询FilreredRowSet的谓词实现,java,jdbc,predicate,rowset,Java,Jdbc,Predicate,Rowset,我有以下谓词实现: public boolean evaluate(RowSet rowset ) {try{ int count=0; CachedRowSet crs = (CachedRowSet)rowset; { if (!crs.isAfterLast())//CRUCIAL LINE for (int i=0;i<index.length;i++)
public boolean evaluate(RowSet rowset )
{try{
int count=0;
CachedRowSet crs = (CachedRowSet)rowset;
{
if (!crs.isAfterLast())//CRUCIAL LINE
for (int i=0;i<index.length;i++)
{
if ((crs.getObject(index[i])).toString().compareTo(high[i].toString())<=0)
{
if ((crs.getObject(index[i])).toString().compareTo(low[i].toString())>=0)
{
count++;
}
}
}
}
我将得到一个java.sql.SQLException:无效的光标位置
。
为什么会这样?如果下一行是afterLast,那么.next()方法是否会返回false
我可以遍历任何结果集,而不必检查(!crs.isAfterLast())。仅使用rs.next()就足够了,因为如果next在最后一个之后,则返回false
为什么在谓词中不发生这种情况?提前感谢。您遇到的问题是Java 7(甚至在7.0_45中)中的一个错误,记录如下: 避免对我有效的“无效光标位置”SQLException的一个简单解决方法是将此逻辑添加到Predicate.evaluate(行集rs)实现的开始,以检测行集结束条件:
FilteredRowSet frs = (FilteredRowSet) rs;
int rowNum = frs.getRow();
if (rowNum == 0) { // Meaning "no current row" - should never happen...
return false; // Needed only to address a bug in Java 7
}
调用isAfterLast()的方法似乎也不错,简单地吞下SQLException的方法也很有效,因为异常发生在所有处理完成之后
该问题在Java8RTE下已修复,无需重新编译
我特别测试了一个谓词实现,它在IntellijIDEA中使用Java8在Java7下失败,也在命令行中失败。在Java8下,它也可以正常工作,而不需要上述Java7解决方案
FilteredRowSet frs = (FilteredRowSet) rs;
int rowNum = frs.getRow();
if (rowNum == 0) { // Meaning "no current row" - should never happen...
return false; // Needed only to address a bug in Java 7
}