【问题标题】:Spring Boot + gcp datastore + datastore 模拟器获取 INVALID_ARGUMENT 遇到“OR”/“IN”
【发布时间】:2021-03-31 17:32:21
【问题描述】:

我有一个在 App Engine 标准环境中运行的应用程序,它使用 Google Cloud Tools 和 Datanucleus 框架来访问数据。

当我在本地环境中运行此应用程序时,它工作正常,当我在 Where 子句中使用 OR 或 IN 进行 Select 时,它会毫无问题地返回表的寄存器。

现在,我想改进我的应用程序并使用 Spring Boot、Spring Cloud GCP 和本地 Cloud Datastore Emulator 创建一个新应用程序。 当我尝试通过 Datastore Emulator 进行查询时,它可以正常工作,但是当查询包含 IN 或 OR 时,模拟器会记录和错误。

查询是:

@Query(value = "SELECT * FROM  Evento WHERE fincaId = @id_finca AND tipoEvento = 3 OR tipoEvento = 4")

还有错误文字:

[datastore] INFORMACI?N: Exception when handling request: INVALID_ARGUMENT: Encountered "OR" at line 1, column 68.
[datastore] Was expecting one of:
[datastore]     <EOF>
[datastore]     "and" ...
[datastore]     "group" ...
[datastore]     "limit" ...
[datastore]     "offset" ...
[datastore]     "order" ...

Datastore Emulator 能否使用 OR 或 IN 子句进行查询?

有没有办法以不同的方式做到这一点?

【问题讨论】:

    标签: spring-boot google-app-engine google-cloud-datastore local-datastore spring-cloud-gcp


    【解决方案1】:

    Datastore 不支持“IN”和“OR”运算符。如果您想拥有这样的功能,您应该发出两个查询并将它们组合在客户端。有关完全支持的查询类型和示例,请查看docs

    【讨论】:

    • 抱歉,在我的旧应用程序中,我在谷歌数据存储上使用了这些类型的过滤器。您拥有 com.google.appengine 库,其中包含 com.google.appengine.api.datastore.Query.CompositeFilterOperator.or 和 com.google.appengine.api.datastore.Query.FilterOperator.IN 可直接从您的应用程序访问使用这种类型的过滤器。问题是我正在改变基础设施,似乎新的在技术上比旧的或更有限的更差。
    猜你喜欢
    • 2021-10-21
    • 2020-12-30
    • 1970-01-01
    • 2020-04-16
    • 2020-11-28
    • 1970-01-01
    • 2019-08-09
    • 2018-04-24
    • 2019-03-17
    相关资源
    最近更新 更多