我想做一个简单的查询,有多个条件
我使用OrmLite来映射实体对象。
现在我想在桌子上搜索一个对象。
假设我有一个映射PERSON表的Person实体,我想要做的是用一些参数初始化一个对象并搜索它。
假设一个函数searchPerson(Person oPerson)
如果我像这样传递一个对象OPerson
Id = null
Name = John
Age = null
Sex = male
是否可以编写查询以达到该目标?像这样的伪代码
pers = (from p in db.Table<Person>()
where (if OPerson.Id !=null) p.Id==OPerson.Id}
AND {(if OPerson.Name !=null) p.Name.Contains(OPerson.Name)}
AND {(if condition) where-contion}
select p).ToList();
我知道我可以用这种方式进行多次查询
list=PersonDao.queryBuilder().where().eq("name",OPerson.name).and().eq("sex",OPerson.sex").query();
但我还要检查值是否存在
答案 0 :(得分:8)
where(如果OPerson.Id!= null)p.Id == OPerson.Id}
@ArghArgh已关闭,但没有正确的AND。问题是AND语句取决于是否有任何先前的语句。我会做类似的事情:
QueryBuilder<Person, Integer> queryBuilder = dao.queryBuilder();
Where<Person, Integer> where = queryBuilder.where();
int condCount = 0;
if (oPerson.id != null) {
where.eq("id", oPerson.id);
condCount++;
}
if (oPerson.name != null) {
where.like("name", "%" + oPerson.name + "%");
condCount++;
}
...
// if we've added any conditions then and them all together
if (condCount > 0) {
where.and(condCount);
}
// do the query
List<Persion> personList = queryBuilder.query();
这使用where.and(int)
method,它在堆栈上包含许多子句,并将它们与AND之间放在一起。
答案 1 :(得分:1)
我认为您必须使用QueryBuilder。 试试这样的事情
QueryBuilder<Person, Integer> queryBuilder = PersonDao.queryBuilder();
// get the WHERE object to build our query
Where<Person, String> where = queryBuilder.where();
if(oPerson.Name!=null)
where.like("Name", "%"+oPerson.Name+"%");
// and
where.and();
if(Person.Sex!=null)
where.like("Sex", "%"+oPerson.sex+"%");
PreparedQuery<Person> preparedQuery = queryBuilder.prepare();
比你可以这样称呼它
List<Person> list = PersontDao.query(preparedQuery);