JDOQL(Appengine) - 查询所有/一个项目,列表作为参数?

时间:2011-02-21 18:09:20

标签: java google-app-engine jdo jdoql

我正在尝试创建一个查询,以便给定列表(参数)的所有项都包含在表的列中(也是一个列表)。我还需要一个查询,以便给定列表(参数)中的至少一个项目包含在表格的列中。例如:

JDO:

Table: User
| ID | Name | Interests <List of Strings> |

查询:

List <String> gifts; // Item to query with
  1. 如何查询所有兴趣与所有礼品相匹配的用户?即所有礼物都应该是利益的一部分。

  2. 如何查询其兴趣与某些(至少一个)礼物相匹配的所有用户?即至少一件礼物是兴趣的一部分。

  3. 如何查询所有与兴趣相符的用户?即所有利益都应该是礼物的一部分。

  4. 如何查询SOME(至少一个)兴趣与礼品相匹配的所有用户?即至少一项利息是礼物的一部分。

  5. 这些查询是否可行?如果是这样呢?我可以使用.contains()关键字来执行这些查询吗?如果是这样,那怎么样?有人可以分享一些例子吗?任何帮助都将受到高度赞赏。

    谢谢。

1 个答案:

答案 0 :(得分:0)

为了理解这些查询的工作方式(或不工作方式),了解数据存储区如何为实体编制索引非常重要。插入具有list属性的实体时,数据存储区会将每个列表条目分成单独的索引行。例如,以下实体:

Entity(User):
  id=15
  name="Jim"
  interests=["Drinking", "Banjos"]

将导致自动索引中的以下索引条目:

(User, "id", 15, Key("User", 1))
(User, "name", "Jim", Key("User", 1))
(User, "interests", "Drinking", Key("User", 1))
(User, "interests", "Banjos", Key("User", 1))

如果您还在(名称,兴趣)上定义了一个复合索引,那么其中的条目将如下所示:

("Jim", "Drinking", Key("User", 1))
("Jim", "Banjos", Key("User", 1))

有了这个,我们可以按顺序解决您的特定查询查询:

  1. 这是不可能的,因为每个条目都在它自己的索引行上。您可以通过为每个兴趣子集创建一个包含一个条目的列表来对此进行索引,并对此进行相等查询,但随着兴趣数量的增加,这会迅速增长,因此如果您希望用户拥有更多,则可能是一个坏主意比方说,5个利益,或者除非你能对这个问题施加更多限制。
  2. 您可以使用“IN”过滤器 - 例如,'SELECT * FROM User WHERE Interests IN [“Drinking”,“Banjos”]' - 这将匹配任何至少有一个“饮酒”和“Banjos”的记录“作为利益。请注意,这将由SDK分解为多个相等子查询,因此它相当于执行与查询列表中的条目一样多的查询。
  3. 这是1.的反过来。再说一遍,它并不实际,除非你将完整的(排序的)兴趣列表存储为字符串,并且你准备为列表的每个子集执行单独的查询礼物。
  4. 如果我没有弄错,这与2相同 - 你正在寻找两组之间的任何交叉,这是一种对称的操作。
  5. 对于数字1和3,你可以通过做一个较粗糙的过滤器 - 例如,搜索一个或两个兴趣 - 并在内存中过滤结果以获得完全匹配。