【发布时间】:2019-05-02 18:29:15
【问题描述】:
我正在尝试从我的数据库中过滤数据,其中包含 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 文档所说的会发生。我错过了什么?
【问题讨论】: