数据存储低级API - 查询多值属性 - FilterOperator.IN无法正常工作

时间:2016-10-18 23:00:51

标签: google-app-engine google-cloud-datastore low-level-api

为什么此过滤器不返回任何实体?我无法解决这个问题。其他过滤器工作正常。

我创建了一个实体,其属性设置为字符串列表。 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]
>

1 个答案:

答案 0 :(得分:0)

将FilterOperator.IN替换为FilterOperator.EQUALS,并将“admin”作为值传递。

FilterOperator.IN与您尝试执行的操作相反 - 它查看属性值(单个值)是否等于您在过滤器中传递的任何值。在引擎盖下,FilterOperator.IN作为一系列FilterOperator.EQUALS查询执行 - 一个用于筛选器列表上的每个值。