DB4O的Filter如下,是用SODA实现的,,NQ不是太适合做这个
/*
DB4O 的 Filter
@author Kevin.Huang
@date 2007-9-29
/
public class DB4OFilter extends Filter {
/*
DB4o的SODA查询接口
*/
private Query query;
/*
@param persistentClass
the persistentClass to set
/
public void setPersistentClass(Class< ? extends Base > persistentClass) {
query.constrain(persistentClass);
}
@Override
public void addBetween(String field, Object low, Object high) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(low).not().smaller().and(fieldQuery.constrain(high).not().greater());
}
@Override
public void addEqualTo(String field, Object value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value);
}
@Override
public void addGreaterOrEqualThan(String field, Object value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value).not().smaller();
}
@Override
public void addGreaterThan(String field, Object value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value).greater();
}
@Override
public void addIn(String field, Collection< Object > value) {
Query fieldQuery = query.descend(field);
if (value != null && !value.isEmpty()) {
boolean started = false;
Constraint c = null;
for (Object o : value) {
if (!started) {
c = fieldQuery.constrain(o);
started = true;
} else {
c = orCollection(fieldQuery, c, o);
}
}
} else {
fieldQuery.constrain(null);
}
}
private Constraint orCollection(Query q, Constraint c, Object o) {
return c.or(q.constrain(o));
}
@Override
public void addIsNull(String field) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(null);
}
@Override
public void addLessOrEqualThan(String field, Object value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value).not().greater();
}
@Override
public void addLessThan(String field, Object value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value).smaller();
}
@Override
public void addLike(String field, String value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value).like();
}
@Override
public void addNotBetween(String field, Object low, Object high) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(low).smaller().and(fieldQuery.constrain(high).greater());
}
@Override
public void addNotEqualTo(String field, Object value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value).not();
}
@Override
public void addNotIn(String field, Collection< Object > value) {
Query fieldQuery = query.descend(field);
if (value != null && !value.isEmpty()) {
boolean started = false;
Constraint c = null;
for (Object o : value) {
if (!started) {
c = fieldQuery.constrain(o);
started = true;
} else {
c = orCollection(fieldQuery, c, o);
}
}
c.not();
} else {
fieldQuery.constrain(null).not();
}
}
@Override
public void addNotLike(String field, String value) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(value).not().like();
}
@Override
public void addNotNull(String field) {
Query fieldQuery = query.descend(field);
fieldQuery.constrain(null).not();
}
@Override
public void addPureLike(String field, String value) {
addLike(field, value);
}
@Override
public void addPureNotLike(String field, String value) {
addNotLike(field, value);
}
/*
@return the query
*/
public Query getQuery() {
return query;
}
/*
@param query
the query to set
/
public void setQuery(Query query) {
this.query = query;
}
用法如下:
public static void main(String[] args) {
ObjectContainer db = null;
db = Db4o.openFile("data/persons.data");
Person kevin = new Person();
kevin.setName("Kevin");
kevin.setAge(26);
Person vivan = new Person();
vivan.setName("Alex");
vivan.setAge(28);
Person John = new Person();
John.setName("John");
John.setAge(30);
db.set(kevin);
db.set(vivan);
db.set(John);
db.commit();
DB4OFilter f = new DB4OFilter();
f.setQuery(db.query());//注入query
f.setPersistentClass(Person.class);//注入要查询的类
f.addEqualTo("name", "Kevin");
f.addEqualTo("age", 28);
ObjectSet< Person > list = f.getQuery().execute();//开始查询
for (Person p : list) {
System.out.println(p.getName());
db.delete(p);
}
db.commit();
db.close();
}