【问题标题】:Datastore query with IN operator使用 IN 运算符的数据存储查询
【发布时间】:2018-01-31 20:05:20
【问题描述】:

新的柔性环境数据存储接口在运行查询时似乎不支持IN 操作。我希望我是错的,如果是这样,如何在 Datastore 的新 Java 接口中使用 IN 运算符?

【问题讨论】:

    标签: java google-cloud-datastore gcloud datastore gcloud-java


    【解决方案1】:

    WHERE color IN('RED', 'BLACK') 这样的查询,数据存储(服务器端)不支持。 OR 运算符也是如此(例如 WHERE color='RED' OR color='BLACK')。一些客户端 API 通过将查询拆分为多个然后合并每个查询的结果来添加此功能。新的google-cloud-java API 尚不支持此功能。现在,您必须对IN 子句中的每个值运行多个查询并合并结果。

    【讨论】:

    • 或者,在可能的情况下,使用批量查找而不是查询。
    【解决方案2】:

    这是来自documentation 的示例:

    如果您想对一个查询设置多个过滤器,则必须使用CompositeFilter,这需要至少两个过滤器。

    Filter tooShortFilter = new FilterPredicate("height", FilterOperator.LESS_THAN, minHeight);
    Filter tooTallFilter = new FilterPredicate("height", FilterOperator.GREATER_THAN, maxHeight);
    Filter heightOutOfRangeFilter = CompositeFilterOperator.or(tooShortFilter, tooTallFilter);
    Query q = new Query("Person").setFilter(heightOutOfRangeFilter);
    

    您也可以使用.and()。此处的代码适用于 Java 7。对于 Java 8,您可以在上面引用的文档中找到相应的代码。我希望这会有所帮助。

    现在到IN。虽然我最近自己没有尝试过,但当前的文档指出它可以仍然用作运算符。根据它,类似下面的代码应该可以工作:

    Filter propertyFilter = new FilterPredicate("height", FilterOperator.IN, minHeights);
    Query q = new Query("Person").setFilter(propertyFilter);
    

    或者,您可以使用Google GQL。它将允许您编写类似 SQL 的语法,您可以在其中使用in(...)

    【讨论】:

    • 它是否适用于新的数据存储 API?
    • 嗯,文档还是一样的,所以我猜是的。
    • 该文档适用于标准环境,而不是灵活的环境:-(
    猜你喜欢
    • 2022-08-25
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多