我有一些麻烦来实现我需要的东西。
代码优于文字: 这是我设置谓词的地方,它是在DBManager中添加FilterRow。 我想要的是获得ID为64和61的所有会员条目。 我的问题是,我只是得到ID为61的id。
PredicateManager pred = new PredicateManager();
String[] nameColumn = new String[]{"id", "id"};
String[] criteria = new String[]{"eq", "eq"};
Comparable<?>[] min = new Comparable[]{61, 64};
Comparable<?>[] max = new Comparable[]{0, 0};
Predicate test = new PredicateORImpl(min, max, null, nameColumn, criteria);
pred.addFilter("Filtre 1", test);
members = facade.read("resources/XML/member.xml", pred);
for (int i = 0 ; i < members.size(); i++) {
AbstractMember maValeur = members.get(i);
System.out.println(maValeur.toString());
}
这是我的Predicate经理,如果我需要几个谓词:
private Map<String,Predicate> filters;
@Override
public boolean evaluate(RowSet rs) {
boolean isOk = true;
for (Predicate predicate : filters.values()){
isOk = predicate.evaluate(rs);
}
return isOk;
}
这是我的谓词实施:
@Override
public boolean evaluate(RowSet rs) {
try {
boolean isOk = true;
int rowNb = (row != null) ? row.length : rowName.length;
for (int i = 0; i < rowNb && isOk; i++) {
switch (criteria[i]) {
case "eq":
isOk &= equal(rs.getObject(rowName[i]), rowName[i]);
break;
case "gt":
isOk &= greaterThan(rs.getObject(rowName[i]), rowName[i]);
break;
case "lt":
isOk &= lessThan(rs.getObject(rowName[i]), rowName[i]);
break;
case "ge":
isOk &= greaterOrEqualThan(rs.getObject(rowName[i]), rowName[i]);
break;
case "le":
isOk &= lessOrEqualThan(rs.getObject(rowName[i]), rowName[i]);
break;
case "between":
isOk &= between(rs.getObject(rowName[i]), rowName[i]);
break;
default: break;
}
}
return isOk;
}
catch(SQLException sqle) { return false; }
}
private boolean equal(Object value, String columnName) {
int column = Arrays.asList(rowName).indexOf(columnName);
Comparable min = this.min[column];
return (min.compareTo(value) == 0);
}
非常感谢你的帮助。
答案 0 :(得分:2)
我的所有成员条目的ID等于64和61
我怀疑问题是您需要ID为64或61的记录.ID不能同时为64和61.
通过尝试在同一个字段上放置两个冲突的条件,您将第一个替换为第二个。
我建议你对表达式的每个元素都有一个谓词,比如树。 e.g。
interface Predicate<T> {
boolean test(T t);
}
class EqualsColumnPredicate implement Predicate<ResultSet> {
final String columnName;
final Object value;
// create a constructor to set these
public boolean test(ResultSet rs) {
return rs.getObject(columnName).equals(value); // TODO check for nulls
}
}
class OrPredicate<T> implements Predicate<T> {
final Prediate<T>[] preciates;
// create a constructor for this field
public boolean test(T t) {
for(Predicate<T> p : predicates)
if(p.test(t)) return true;
return false;
}
}
Predicate<T> where = new OrPredicate<ResultSet>(
new EqualsColumnPredicate("column", 64),
new EqualsColumnPredicate("column", 61));
while(rs.next())
if (where.test(rs))
// found !!