The following features of the JDO interface are not supported by the App Engine implementation:
-
contains()
syntax for query filters on Collection fields. You can test that a multi-valued property (a Collection field) has a value using an equality filter:collection == "value"
下面通过%appengine-java-sdk-1.2.2%\demos\jdoexamples中的“Friend”例子来学习使用 collection == "value" 。
appengine-java-sdk-1.2.1发布时,由于没有http://127.0.0.1:8080/_ah/admin,“Friend”例子不好理解。1.2.2版本新增了Datastore Viewer,便于观察已保存的实体。
对于POJO Friend,可以通俗地理解为:一个人的姓、名,及其朋友集合。如果为A添加朋友B,那么B的朋友集合中也有A。如果为A添加朋友C,那么C的朋友集合中也有A。B和C不一定是朋友。无论为A添加多少朋友,Datastore中,姓=A的姓,且名=A的名的实体只有一个。形如:“A的姓 A的名 [B, C, ...]”。(其Datastore Viewer效果见附件,将Barney Rubble理解为A)
当查询A的所有的朋友时,使用了collection == "value",代码如下:
public static List<Friend> getFriendsOf(String lastName, String firstName) {
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(Friend.class);
String myKey = KeyFactory.keyToString(getKeyForName(lastName, firstName));
query.declareParameters("String myKey");
query.setFilter("friends == myKey");
query.setOrdering("lastName ASC, firstName ASC");
List<Friend> friends = (List<Friend>) query.execute(myKey);
return friends;
}
lastName和firstName为A的姓和名,将其转换为Datastore平台特有的“myKey”(关于Key,就不详述了)。注意代码query.setFilter("friends == myKey"),friends的类型为Collection<String>,但在设置过滤条件时却是用了符号“==”!