代码之家  ›  专栏  ›  技术社区  ›  Rollerball

JAVA中的谓词实现查询FilreredRowSet

  •  0
  • Rollerball  · 技术社区  · 11 年前

    我有以下谓词实现:

    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++;
                        }
                    }
    
                }
            }
    

    现在,如果我评论掉“关键线”,那么:

                if (!crs.isAfterLast())
    

    我会得到一个 java.sql.SQLException: Invalid cursor position . 为什么会这样?如果下一行是afterLast,那么.next()方法是否会返回false?

    我可以遍历任何结果集,而无需检查 if (!crs.isAfterLast()) 。只使用rs.next()就足够了,因为如果next在last之后,它会返回false。

    为什么在谓词中没有发生这种情况?提前谢谢。

    1 回复  |  直到 11 年前
        1
  •  1
  •   skomisa    11 年前

    您遇到的问题是Java 7中的一个错误(甚至在7.0_45中也是如此),文档如下: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7166598

    避免“无效光标位置”SQLException的一个简单解决方法是将此逻辑添加到Predicate.eevaluate(RowSet-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的丑陋变通方法也很有效,因为异常发生在所有处理完成之后。

    这个问题在Java 8 RTE下得到了修复,不需要重新编译。

    我特别测试了一个Predicate实现,它在Intellij Idea中使用Java 8在Java 7下失败,也在命令行中失败。在Java 8下,它也可以很好地工作,而不需要上面描述的Java 7解决方法。