此查询有效,fullPath字段为List<String>

    KeyLookup lookup
        = ofy().load().type(KeyLookup.class).filter("fullPath IN", key.getFullPath()).first().get();


上面的查询还获取了与StringList<String>中具有相同key.getFullPath()元素的实体,但是,它还获取了列表中具有相同String且列表中具有更多String的那些实体。

如何只过滤列表中元素完全相同的那些实体,例如“不多不少”

更新:

例如

一个实体(例如Object1)字段fullPath包含:


“一”
“二”
“三”


另一个实体(例如Object2)字段fullPath包含:


“一”
“二”
“三”
“四个”


而且key.getFullPath包含:


“一”
“二”
“三”
“四个”


然后上面的查询将返回Object1Object2,但是我需要的是它仅返回Object2

最佳答案

这是可以预期的,因为在比较查询中的两个列表时,实际发生的情况是数据存储针对过滤器列表中的每个值触发多个查询。因此,查询Object2时,将对Object2中的每个值执行四个查询。由于Object1Object2的“子集”,因此它也与查询匹配。这就是您同时获得Object1Object2的原因。

您可以修改查询以使用AND运算符,以强制进行精确匹配。因此,您可以拥有以下内容:

Query<KeyLookup> q = ofy().load().type(KeyLookup.class);
for (String f : key.getFullPath()) {
    q = q.filter("fullPath", f);
}
KeyLookup lookup = q.first().get();


希望这可以帮助。

10-07 23:03