我尝试构建一个查询语句,如果用户名与数据库中的姓氏或名字匹配,则返回结果,即
("姓氏",Query.FilterOperator.EQUAL,用户名)或("名字",Query.FilterOperator.EQUAL,用户名)
但我不知道语法。有人能指出我正确的方向吗?
(对不起,我知道我不应该在这里问基本的编程问题,我看到Magento的相关帖子(addfieldtofilter),但不是GAE。)
答案 0 :(得分:4)
正如Making 'OR' Queries in Google App Engine Data Model首要答案简明扼要地说明的那样,"数据存储区上没有OR
操作。您必须执行两个单独的查询,并在您自己的代码中找到交叉点"。 (好吧,应该是联盟,而不是交集,当然: - )。
这个特定的问题提到了objectify
,但是,它并不是客观化 - 只是限制了数据存储的工作方式。 (即使!=
和IN
运算符看似有效,也是一种视错觉,在应用程序端实现了两个或多个单独的查询,然后在内存中结合它们。在App Engine中 python ,ndb
数据存储区访问层 提供ndb.OR
运算符 - 但 也会被模拟在应用程序级别(从数据存储区的角度来看,它的多个查询 - 然后ndb的应用程序级代码执行内存联合)。
我想有人可以类似地为Java构建一个数据存储访问框架(例如fork和enrich objectify
),以便像OR
一样模拟ndb
,但最好的是我的知识,没有人认为这值得烦恼(我发现很难不同意 - 尽管ndb
是由Python的发明者和领导者Guido van Rossum设计和实现的,当时他专门在Google App上工作所以他的工程判断可能比我的更值得信任: - )。