在JAVA中谓词实现查询FilreredRowSet

时间:2013-09-19 13:02:31

标签: 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++)
            {
                if ((crs.getObject(index[i])).toString().compareTo(high[i].toString())<=0)
                {
                    if ((crs.getObject(index[i])).toString().compareTo(low[i].toString())>=0)
                    {
                        count++;
                    }
                }

            }
        }

现在,如果我评论出关键线&#34;因此:

            if (!crs.isAfterLast())

我会得到java.sql.SQLException: Invalid cursor position。 为什么会这样?如果下一行是afterLast?

,它是否会被使用.next()方法返回false

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

为什么在谓词中这不会发生?提前谢谢。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是Java 7中的错误(即使在7.0_45中),在此处记录:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7166598

避免“无效游标位置”的简单解决方法对我有用的SQLException是将此逻辑添加到Predicate.evaluate(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实现,该实现在Java 7中使用Java 8,在Intellij Idea中以及命令行中失败。在Java 8下,它也可以正常工作,而无需上述的Java 7解决方法。