Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDOQL(Appengine)-使用列表作为参数查询所有/一项?_Java_Google App Engine_Jdo_Jdoql - Fatal编程技术网

Java JDOQL(Appengine)-使用列表作为参数查询所有/一项?

Java JDOQL(Appengine)-使用列表作为参数查询所有/一项?,java,google-app-engine,jdo,jdoql,Java,Google App Engine,Jdo,Jdoql,我正在尝试创建一个查询,以便给定列表(参数)的所有项都包含在表的列(也是列表)中。我还需要一个查询,以便表的列中至少包含给定列表(参数)的一项。例如: JDO: Table: User | ID | Name | Interests <List of Strings> | List <String> gifts; // Item to query with 表:用户 |身份证|姓名|权益| 查询: Table: User | ID | Name | Interest

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

JDO:

Table: User
| ID | Name | Interests <List of Strings> |
List <String> gifts; // Item to query with
表:用户
|身份证|姓名|权益|
查询:

Table: User
| ID | Name | Interests <List of Strings> |
List <String> gifts; // Item to query with
列出礼物;//要查询的项目
  • 如何查询兴趣与所有礼物匹配的所有用户?i、 所有礼物都应该是兴趣的子集

  • 如何查询兴趣与某个(至少一个)礼物匹配的所有用户?i、 至少有一份礼物是利益的子集

  • 我如何查询所有兴趣与礼物匹配的用户?i、 所有兴趣都应该是礼物的子集

  • 如何查询某些(至少一个)兴趣与礼物匹配的所有用户?i、 e.至少有一种利益是礼物的子集

  • 这些问题可能吗?如果是的话,那怎么办?我可以使用
    .contains()
    关键字进行这些查询吗?如果是,那怎么办?有人能分享一些例子吗?任何帮助都将不胜感激


    谢谢。

    为了了解这类查询是如何工作的(或不工作的),了解数据存储如何索引实体很重要。插入具有列表属性的实体时,数据存储会将每个列表条目拆分为单独的索引行。例如,以下实体:

    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))
    
    有了这一点,我们可以解决您的特定查询,顺序如下:

  • 这是不可能的,因为每个条目都位于自己的索引行上。您可以通过为每个兴趣子集创建一个包含一个条目的列表来对此进行索引,并对该列表执行相等查询,但随着兴趣数量的增加,这会快速增长,因此,如果您希望用户的兴趣超过(比如)5个,或者除非您可以对问题施加更多约束,那么这可能是一个坏主意
  • 您可以使用“IN”过滤器-例如,“SELECT*FROM User WHERE interest IN[“Drinking”,“Banjos”]”-这将匹配至少有一个“Drinking”和“Banjos”作为兴趣的任何记录。请注意,SDK会将其分解为多个相等子查询,因此这相当于执行查询列表中的条目数量相同的查询
  • 这是1的倒数。同样,这并不实际,除非您已将完整(排序)的兴趣列表存储为字符串,并且准备对礼物列表的每个子集执行单独的查询
  • 如果我没弄错的话,这和2是一样的——你在寻找两个集合之间的任何交集,这是一个对称的运算

  • 对于数字1和3,你可以做一个更粗的过滤——例如,搜索一个或两个兴趣点——然后在内存中过滤结果以获得精确匹配。

    Ahhh我明白了。非常感谢你。这正是我需要知道的!