数据存储低级别 API - 查询多个值 属性 - FilterOperator.IN 不工作
Datastore Low level API - query multiple value property - FilterOperator.IN not working
为什么这个过滤器 return 没有实体?我搞不定。其他过滤器工作正常。
我创建了一个 属性 设置为字符串列表的实体。 List 也是一个 Collection,因此 Datastore 应该接受它(我认为它接受 *)。
Key aliceKey = KeyFactory.createKey("User", user.getEmail());
Entity alice = new Entity(aliceKey);
List<String> roles = new ArrayList<String>();
roles.add("admin");
roles.add("user");
alice.setProperty("role", roles);
我将它保存到数据存储区:
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(alice);
现在我进行查询:FilterOperator.IN 在 FilterPredicate 构造函数的第三个参数中需要一个 Iterable,即 rolesList。
List<String> rolesList = new ArrayList<String>();
rolesList.add("admin");
Filter propertyFilter = new FilterPredicate("role", FilterOperator.IN, rolesList);
Query q = new Query("User").setFilter(propertyFilter);
List<Entity> c = datastore.prepare(q).asList(FetchOptions.Builder.withDefaults());
if(c.size()==0)
response.getWriter().println("nothing");
for (int i = 0; i < c.size(); i++) {
response.getWriter().println(c.get(i).toString());
}
属性 中的值在这里的格式是否正确?这是 alice.toString()
的输出
Alice: <Entity [User("test@example.com")]:
role = [admin, zone admin]
>
将 FilterOperator.IN 替换为 FilterOperator.EQUALS,并将 "admin" 作为值传递。
FilterOperator.IN 与您尝试做的相反 - 它看起来 属性 值(单个值)是否等于您在过滤器中传递的任何值。在幕后,FilterOperator.IN 作为一系列 FilterOperator.EQUALS 查询执行 - 过滤器列表中的每个值一个。
为什么这个过滤器 return 没有实体?我搞不定。其他过滤器工作正常。
我创建了一个 属性 设置为字符串列表的实体。 List 也是一个 Collection,因此 Datastore 应该接受它(我认为它接受 *)。
Key aliceKey = KeyFactory.createKey("User", user.getEmail());
Entity alice = new Entity(aliceKey);
List<String> roles = new ArrayList<String>();
roles.add("admin");
roles.add("user");
alice.setProperty("role", roles);
我将它保存到数据存储区:
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(alice);
现在我进行查询:FilterOperator.IN 在 FilterPredicate 构造函数的第三个参数中需要一个 Iterable,即 rolesList。
List<String> rolesList = new ArrayList<String>();
rolesList.add("admin");
Filter propertyFilter = new FilterPredicate("role", FilterOperator.IN, rolesList);
Query q = new Query("User").setFilter(propertyFilter);
List<Entity> c = datastore.prepare(q).asList(FetchOptions.Builder.withDefaults());
if(c.size()==0)
response.getWriter().println("nothing");
for (int i = 0; i < c.size(); i++) {
response.getWriter().println(c.get(i).toString());
}
属性 中的值在这里的格式是否正确?这是 alice.toString()
的输出Alice: <Entity [User("test@example.com")]:
role = [admin, zone admin]
>
将 FilterOperator.IN 替换为 FilterOperator.EQUALS,并将 "admin" 作为值传递。
FilterOperator.IN 与您尝试做的相反 - 它看起来 属性 值(单个值)是否等于您在过滤器中传递的任何值。在幕后,FilterOperator.IN 作为一系列 FilterOperator.EQUALS 查询执行 - 过滤器列表中的每个值一个。