使用 ORMlite OR 子句的异常
Exception using ORMlite OR clause
我在 ORMLite 中尝试使用 'or' 子句时遇到了麻烦,但出现以下异常:
Caused by: java.lang.IllegalStateException: Expecting there to be a clause already defined for 'OR' operation
at com.j256.ormlite.stmt.Where.pop(Where.java:702)
at com.j256.ormlite.stmt.Where.or(Where.java:381)
我已经搜索过 around and RTFM,但我不太明白我做错了什么。我查看了抛出异常的行,当它期望有东西存在时,堆栈似乎是空的。
我尝试稍微更改查询,所有三个示例如下:
List<Contacts> list = new ArrayList<Contacts>();
Dao<Contacts,Integer> dao = DatabaseManager.getInstance().getDaoForClass(Contacts.class);
final QueryBuilder<Contacts, Integer> queryBuilder = dao.queryBuilder();
nameFilter = "%" + nameFilter + "%";
// Tried this way:
queryBuilder.where().or(queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter),
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter),
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter));
// And then this way:
queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
queryBuilder.where().or();
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
queryBuilder.where().or();
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
// And this way
queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
queryBuilder.where().or(3);
queryBuilder.orderByRaw(Contacts.FIELD_NAME_LAST_NAME + " COLLATE NOCASE, " + Contacts.FIELD_NAME_FIRST_NAME + " COLLATE NOCASE");
list = queryBuilder.query();
如何编写这个简单的查询?
正如@Selvin 评论的那样,这解决了它:
Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
where.or(3);
你有答案,但我想我会为后代添加更多细节。 QueryBuilder.where()
method produces a new Where
object each time. ORMLite 抛出异常,因为它只看到最后一个 where()
方法调用,即:
queryBuilder.where().or(3);
所以它看不到任何其他 like(...)
方法调用,因为它们是在不同的 Where
对象上进行的。
如果您查看 building queries documentation,您会发现模式是调用 where()
一次,然后使用 Where
对象构建 SQL WHERE
子句:
Where where = queryBuilder.where();
where.or(where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter),
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter),
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter));
或:
Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.or();
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.or();
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
或:
Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
where.or(3);
我在 ORMLite 中尝试使用 'or' 子句时遇到了麻烦,但出现以下异常:
Caused by: java.lang.IllegalStateException: Expecting there to be a clause already defined for 'OR' operation
at com.j256.ormlite.stmt.Where.pop(Where.java:702)
at com.j256.ormlite.stmt.Where.or(Where.java:381)
我已经搜索过 around and RTFM,但我不太明白我做错了什么。我查看了抛出异常的行,当它期望有东西存在时,堆栈似乎是空的。
我尝试稍微更改查询,所有三个示例如下:
List<Contacts> list = new ArrayList<Contacts>();
Dao<Contacts,Integer> dao = DatabaseManager.getInstance().getDaoForClass(Contacts.class);
final QueryBuilder<Contacts, Integer> queryBuilder = dao.queryBuilder();
nameFilter = "%" + nameFilter + "%";
// Tried this way:
queryBuilder.where().or(queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter),
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter),
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter));
// And then this way:
queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
queryBuilder.where().or();
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
queryBuilder.where().or();
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
// And this way
queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
queryBuilder.where().or(3);
queryBuilder.orderByRaw(Contacts.FIELD_NAME_LAST_NAME + " COLLATE NOCASE, " + Contacts.FIELD_NAME_FIRST_NAME + " COLLATE NOCASE");
list = queryBuilder.query();
如何编写这个简单的查询?
正如@Selvin 评论的那样,这解决了它:
Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
where.or(3);
你有答案,但我想我会为后代添加更多细节。 QueryBuilder.where()
method produces a new Where
object each time. ORMLite 抛出异常,因为它只看到最后一个 where()
方法调用,即:
queryBuilder.where().or(3);
所以它看不到任何其他 like(...)
方法调用,因为它们是在不同的 Where
对象上进行的。
如果您查看 building queries documentation,您会发现模式是调用 where()
一次,然后使用 Where
对象构建 SQL WHERE
子句:
Where where = queryBuilder.where();
where.or(where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter),
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter),
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter));
或:
Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.or();
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.or();
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
或:
Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
where.or(3);