文章目录

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();
 }

文章目录