【问题标题】:Datastore Low level API - query multiple value property - FilterOperator.IN not working数据存储低级 API - 查询多值属性 - FilterOperator.IN 不起作用
【发布时间】:2016-10-18 23:00:50
【问题描述】:

为什么这个过滤器不返回任何实体?我搞不定。其他过滤器也可以正常工作。

我创建了一个属性设置为字符串列表的实体。 List 也是一个集合,因此 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,即角色列表。

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]
>

【问题讨论】:

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


    【解决方案1】:

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

    FilterOperator.IN 与您尝试做的相反 - 它查看属性值(单个值)是否等于您在过滤器中传递的任何值。在底层,FilterOperator.IN 是作为一系列 FilterOperator.EQUALS 查询执行的——过滤器列表中的每个值都有一个查询。

    【讨论】:

    • 我用“admin”尝试了 EQUAL 运算符,但仍然一无所获。然后我注意到我已经离开了属性 Unindexed: entity.setUnindexedPorperty("role", list)
    • 你是对的,我错了:我认为向过滤器添加“角色”会搜索具有所有这些“角色”的实体。我需要的是对查询应用更多过滤器:) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多