我正在尝试从数据库中过滤数据,该数据库包含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会这样说。我想念什么?
答案 0 :(得分:0)
我在过滤器上发现了其他信息,但未提及累积应用的过滤器,这使我相信它们并未累积应用(还好吗?)。我通过将数组作为对象传递给过滤器来解决此问题,这样它就可以遍历数组以检查一个过滤器中的多列。