FilteredRowSet过滤器未累计应用

时间:2019-05-02 18:29:15

标签: java jdbc

我正在尝试从数据库中过滤数据,该数据库包含NHL游戏统计信息。我想创建一个FilteredRowSet来容纳两个特定团队之间的所有比赛。我有过滤器可以这样做,但是过滤器将不会累积应用。当我应用第二个过滤器时,它将取消第一个过滤器。

我尝试实现许多不同类型的过滤器,但是由于团队可能位于两列之一中,所以我总是遇到一个问题。我无法找到一种方法来检查两列是否都满足我的要求。

这是我正在使用的过滤器

公共类TeamFilter实现谓词{

private int lo;
private int hi;
private String colName = null;
private int colNumber = -1;

public TeamFilter(int lo, int hi, int colNumber) {
    this.lo = lo;
    this.hi = hi;
    this.colNumber = colNumber;
}

public TeamFilter(int lo, int hi, String colName) {
    this.lo = lo;
    this.hi = hi;
    this.colName = colName;
}

@Override
public boolean evaluate(Object value, String columnName) {
    boolean evaluation = true;
    if (columnName.equalsIgnoreCase(this.colName)) {
        int columnValue = ((Integer) value).intValue();
        if ((columnValue == this.lo) || (columnValue == this.hi)) {
            evaluation = true;
        } else {
            evaluation = false;
        }
    }
    return evaluation;
}

@Override
public boolean evaluate(Object value, int columnNumber) {

    boolean evaluation = true;

    if (this.colNumber == columnNumber) {
        int columnValue = ((Integer) value).intValue();
        if ((columnValue == this.lo) || (columnValue == this.hi)) {
            evaluation = true;
        } else {
            evaluation = false;
        }
    }
    return evaluation;
}

@Override
public boolean evaluate(RowSet rs) {

    CachedRowSet frs = (CachedRowSet) rs;
    boolean evaluation = false;

    try {
        int columnValue = -1;

        if (this.colNumber > 0) {
            columnValue = frs.getInt(this.colNumber);
        } else if (this.colName != null) {
            columnValue = frs.getInt(this.colName);
        } else {
            return false;
        }

        if ((columnValue == this.lo) || (columnValue == this.hi)) {
            evaluation = true;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (NullPointerException npe) {
        System.err.println("NullPointerException caught");
        return false;
    }
    return evaluation;
}

}

这就是我在FilteredRowSet上实现过滤器的方式

TeamFilter fltr1 = new TeamFilter(homeID, awayID, 4);
            TeamFilter fltr4 = new TeamFilter(homeID, awayID, 5);
            FilteredRowSet trs = new FilteredRowSetImpl();
            trs.setCommand("SELECT * FROM GAMES");
            trs.setUsername("root");
            trs.setPassword("rootpass");
            trs.setUrl("jdbc:mysql://localhost:3306/" + "testData"
                    + "?useUnicode=true&useJD"
                    + "BCCompliantTimezoneShift=true&useLegacyDatetimeCode=fal"
                    + "se&serverTimezone=EST");
            trs.execute();

            // filters the rowset
            trs.beforeFirst();
            trs.setFilter(fltr1);
            while (trs.next()) {
                System.out.println((long) trs.getDouble("GAMENUMBER") + ", "
                        + trs.getString("HomeTeam") + ", "
                        + trs.getString("AwayTeam") + ", "
                        + trs.getInt("homeID") + ", " + trs.getInt("awayID"));
            }
            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            trs.beforeFirst();
            trs.setFilter(fltr4);
            while (trs.next()) {
                System.out.println((long) trs.getDouble("GAMENUMBER") + ", "
                        + trs.getString("HomeTeam") + ", "
                        + trs.getString("AwayTeam") + ", "
                        + trs.getInt("homeID") + ", " + trs.getInt("awayID"));
            }

            trs.beforeFirst();

这是我在第二个过滤器之前和之后得到的。

Output of the FilteredRowSet before and after second filter 第一个过滤器过滤主队,第二个过滤器过滤客队。我要寻找的球队是纽约游骑兵队和达拉斯之星队。如您所见,一旦执行了第二个过滤器,就只会显示客队是这两个球队之一的比赛。仅当主队是这两个球队之一时,才进行第一个筛选。过滤器将不会累积应用,即使oracle docs会这样说。我想念什么?

1 个答案:

答案 0 :(得分:0)

我在过滤器上发现了其他信息,但未提及累积应用的过滤器,这使我相信它们并未累积应用(还好吗?)。我通过将数组作为对象传递给过滤器来解决此问题,这样它就可以遍历数组以检查一个过滤器中的多列。