`

gae 数据存储的 查询说明

阅读更多

查询和索引

每个数据存储区查询都使用一个索引,即包含按指定顺序排列的查询结果的表格。App Engine 应用程序会在一个名为 datastore-indexes.xml 的配置文件中定义其索引。 开发网络服务器在遇到未配置索引的查询时会自动为该文件生成建议。

基于索引的查询机制支持大多数常见查询类型,但不支持您可能惯用的来自其他数据库技术的一些查询。以下描述了对查询的限制及其对此所做的说明。

引入查询

查询从数据存储区中检索满足一组条件的实体。查询会指定一种实体、基于属性值的零个或多个条件(有时称作“过滤器”)以及零个或多个排序顺序描述。执行查询时,它会抓取指定类型中满足所有指定条件并按照描述的顺序排序的全部实体。

JDO 可针对满足特定条件的实体执行查询。您还可使用 JDO Extent 来表示某种类型每个实体的集合(某个类的每个存储对象)。

使用 JDOQL 的查询

JDO 包含一种查询语言,用于检索满足一组条件的对象。该语言名为 JDOQL,可直接引用 JDO 数据类和字段,并包括对查询参数和结果的类型检查。JDOQL 与 SQL 类似,但是更适合面向对象的数据库(如 App Engine 数据存储区)。(App Engine 数据存储区不支持对 JDO 接口的 SQL 查询)

查询 API 支持多种调用样式。可使用 JDOQL 字符串语法在字符串中指定一个完整的查询。还可通过对查询对象调用方法来指定查询的一部分或全部。

以下是一个使用方法调用样式的简单查询示例,带有一个过滤条件和一种排序顺序,对过滤条件中使用的值使用参数替换。查询对象的execute() 方法和要在查询中替换的值按照其声明的顺序一起调用。

import java.util.List;
import javax.jdo.Query;

// ...

    Query query = pm.newQuery(Employee.class);
    query.setFilter("lastName == lastNameParam");
    query.setOrdering("hireDate desc");
    query.declareParameters("String lastNameParam");

    try {
        List<Employee> results = (List<Employee>) query.execute("Smith");
        if (results.iterator().hasNext()) {
            for (Employee e : results) {
                // ...
            }
        } else {
            // ... no results ...
        }
    } finally {
        query.closeAll();
    }

下面是使用字符串语法的相同查询:

    Query query = pm.newQuery("select from Employee " +
                              "where lastName == lastNameParam " +
                              "order by hireDate desc " +
                              "parameters String lastNameParam")

    List<Employee> results = (List<Employee>) query.execute("Smith");

可混合这些定义查询的样式。例如:

    Query query = pm.newQuery(Employee.class,
                              "lastName == lastNameParam order by hireDate desc");
    query.declareParameters("String lastNameParam");

    List<Employee> results = (List<Employee>) query.execute("Smith");

可通过多次调用 execute() 方法,使用不同的值替换参数来重用单个 Query 实例。每次调用都将执行查询,并以集合的形式返回结果。

JDOQL 字符串语法对字符串值和数字值支持字符串中的值字面量。用单引号 (') 或双引号 (") 将字符串引起。所有其他值类型必须使用参数替换。以下是使用字符串字面值的示例:

    Query query = pm.newQuery(Employee.class,
                              "lastName == 'Smith' order by hireDate desc");

查询过滤条件

过滤条件指定字段名称、运算符和值。值必须由应用程序提供;它不能引用其他属性或按照其它属性计算。运算符可以是任意以下运算符:< <= == >= >

注意:Java 数据存储区接口不支持在 Python 数据存储区接口中实现的 != 和 IN 过滤条件运算符。(在 Python 接口中,这些运算符是在客户端的库中作为多数据存储区查询实现的,它们并非数据存储区本身的功能。)

过滤条件的主题可以是任意对象字段,包括主键和父实体组(请参阅事务)。

实体必须匹配所有的过滤条件才可成为结果。在 JDOQL 字符串语法中,用 &&(逻辑“与”)分隔指定多个过滤条件。不支持过滤条件的其他逻辑组合(逻辑“或”、“非”)。

由于 App Engine 数据存储区执行查询的方式,单个查询无法对多个属性使用不等过滤条件 (< <= >= >)。但允许对同一属性使用多个不等过滤条件(如查询值范围)。请参阅查询限制

    query.setFilter("lastName == 'Smith' && hireDate > hireDateMinimum");
    query.declareParameters("Date hireDateMinimum");

查询排序顺序

排序顺序可指定属性和方向(升序或降序)。结果返回时将以给定的顺序排序(按照它们指定的顺序)。如果没有为查询指定排序顺序,则结果将按照其实体键排序。

由于 App Engine 数据存储区执行查询的方式,如果查询对一个属性指定了不等过滤条件并对其他属性指定了排序顺序,则使用不等过滤条件的属性必须在其他属性之前排序。请参阅查询限制

    query.setOrdering("hireDate desc, firstName asc");

查询范围

查询可指定要返回到应用程序的结果的范围。范围可指定在完整结果集中哪个结果应最先返回,哪个应最后返回(使用数字索引,第一个结果从 0 开始)。例如,范围 5, 10 将返回第 6、7、8、9、10 个结果。

起始偏移具有性能含义:数据存储区必须检索然后丢弃起始偏移前的所有结果。例如,范围为 5, 10 的查询将先从数据存储区抓取 10 个结果,然后丢弃前 5 个并将剩余的 5 个返回到应用程序。

    query.setRange(5, 10);

扩展

JDO Extent 表示特定类在数据存储区中的每个对象。

可使用 PersistenceManager 的 getExtent() 方法(向其传递数据类)开始 Extent。Extent 类可实现用于访问结果的 Iterable 接口。在完成访问结果后,可调用 closeAll() 方法。

以下示例循环访问数据存储区中的每个 Employee 对象:

import java.util.Iterator;
import javax.jdo.Extent;

// ...

    Extent extent = pm.getExtent(Employee.class, false);
    for (Employee e : extent) {
        // ...
    }
    extent.closeAll();

扩展可批量检索结果,并可超出应用到查询的 1000 个结果的限制。

分享到:
评论

相关推荐

    使用 Bigtable、Blobstore 和 Google Storage 实现 GAE 存储.doc

    为了解决这个问题,GAE提供了多种数据存储解决方案,包括Bigtable、Blobstore和Google Storage for Developers。这三种存储方法都有各自的特性和用途,适用于不同类型的存储需求。 1. **Bigtable (Datastore)**:...

    GAE入门教程.pdf

    - 通过 GAE,你可以创建一个简单的留言本应用,展示如何使用数据存储、用户身份验证和 Web 框架。 2. **开发环境** - 需要下载并安装 GAE SDK,它包含了开发和调试所需的工具。 - SDK 包含一个模拟 App Engine ...

    小学期GAE项目 python+Django框架实现的博客

    GAE提供了自动扩展、负载均衡和数据存储等服务,无需担心服务器运维,开发者可以专注于应用的开发。 **Python** 是一种高级编程语言,以其简洁、易读的语法和强大的库支持而受到广泛欢迎。在Web开发领域,Python常...

    Struts2,Spring,JDO,AJAX on GAE

    GAE提供了一系列服务,如数据存储(使用NoSQL的Bigtable)、任务队列、邮件服务等,并有自动扩缩容能力。 【项目结构】 根据给出的文件列表,可以看出这是一个典型的Java Web项目结构: - `.classpath`:包含项目的...

    谷歌师兄的leetcode刷题笔记-gae-records:Go中GoogleAppEngine数据源的ActiveRecord包装

    数据存储区的活动记录 Gaerecords 是围绕 的轻量级包装器,提供 Active Record 和 DBO 风格的数据管理。 项目目标 初学者简单:让初学者可以轻松开始使用数据存储 熟悉:使使用数据存储的感觉与在其他 OO 语言中相同...

    Google App Engine SDK

    在google.appengine.ext.remote_api里面,我们看到这个离线访问GAE数据的这个API,这就意味着,定时任务之类的离线应用将可以在本地完成,如果你自己有一台服务器,那么在这台服务器上运行GAE的离线任务,将成为可能...

    wallet-angularjs-gae

    开发者可以在GAE上托管后端服务,处理数据存储、任务调度、身份验证等各种任务。 项目中的文件名列表"wallet-angularjs-gae-master"表明这是一个Git仓库的主分支,通常包含以下组件: 1. `appengine-web.xml`:这...

    gae_clouddrive:Google App Engine (GAE) 上的 Cloud Drive 应用程序

    在GAE上集成Google Cloud Storage (GCS) 可以实现高效的数据存储和访问,这对于需要大量文件操作的应用程序尤其有用。** **Cloud Drive应用程序是GAE上的一个示例应用,展示了如何通过GAE的API和GCS接口进行交互。...

    appinfo-endpoint:GAE 上的 AppInfo 端点

    - `models/`: 应用的数据模型,可能包含了定义在GAE数据存储中的实体类。 - `handlers/`: 处理特定HTTP请求的处理器函数,每个端点可能会对应一个或多个处理器。 - `tests/`: 单元测试和集成测试,确保端点功能正确...

    gae-webmonitor:用于跟踪 Google AppEngine 网页更改的简单 Web 监视器

    它不包含测试用例,并且不会处理访问数据存储时出现的潜在错误。 还需要手动插入数据存储条目。安装说明将项目导入 Eclipse。 确保 App Engine SDK jar 存在于war/WEB-INF/lib目录中,方法是手动添加它们,或者让 ...

    CSC847_GAE_Proj2_VisionAPI

    您将使用GCP的数据存储区(NoSQL数据库)存储照片的元数据,其中包括拍摄照片地点的摄影师的姓名,拍摄照片的日期和拍摄日期。 要存储实际的照片图像,您将使用GCP的Cloud Storage。 您的网络界面将至少包括以下...

    gae-flightlog

    这个gae-flightlog项目就是基于这个模板构建的,因此我们可以推断它会包含基本的Web服务端点、数据存储机制以及可能的用户认证等常见功能。 【标签】中的"Java"表明该项目使用Java编程语言。Google App Engine支持...

    sisbarc-gae:使用在 GAE 上运行的 Arduino、Android 和 JAVA WEB 技术的应用程序。 此应用程序的目的和对家庭自动化的介绍

    GAE 支持多种服务,如数据存储、任务队列、身份验证等,这使得 sisbarc-gae 能够高效、可扩展地运行。使用 Java 作为编程语言,开发者可以利用 JSP(Java Server Pages)、Servlets、Spring 框架等来构建后端逻辑。 ...

    云计算下的可配置人力资源管理系统设计分析.pdf

    在本文中,作者提及使用GAE云平台中的相关技术和建立在BigTable基础上的GAE数据库Datastore,这些技术保证了数据的储存和操作的安全。Datastore能够进行高效的数据查询和存储,适合Web系统的使用。 3. 人力资源管理...

    gae-blog:我为 CP300 培训写的博客

    - Google App Engine的架构和工作原理,如自动缩放、负载均衡和数据存储选项。 - Java Web开发,包括Servlets、JSP、MVC模式等。 - 使用Maven进行项目管理和构建。 - Ajax技术的应用,包括XMLHttpRequest对象、JSON...

    guestbook:使用Java和Mavin的带有GAE的示例项目

    2. **Google App Engine的API**:如何使用GAE提供的服务,如数据存储(Datastore)、任务队列(Task Queues)和邮件服务等。 3. **Java Servlet和JSP**:如何处理HTTP请求,生成动态内容,以及使用JSP进行视图层的...

    entass3cms:带有休息服务器和任务队列的 ass3 前端 gae 应用程序

    1. **Google App Engine (GAE)**:Google提供的云平台,允许开发者部署和运行Web应用程序,自动处理基础设施如服务器、存储和负载均衡。 2. **RESTful API服务器**:应用程序提供了一种基于HTTP的RESTful接口,允许...

    部署一个简单GWT应用到Google App Engine

    GAE提供了服务器、数据库、存储和其他基础设施,开发者无需关心运维细节。主要特点有: 1. **弹性伸缩**:根据应用负载自动调整资源,确保性能和可靠性。 2. **免费额度**:提供一定的免费资源,适合初创项目或小型...

    Google App Engine 入门教程

    GAE提供了包括Python、Java在内的多种语言支持,并且提供了数据存储、API调用、用户认证等丰富的服务组件。 标题中提到的“Google App Engine 入门教程”意味着本文将介绍如何开始使用GAE这一服务,而描述中提到了...

    分享:集成了Django1.0 的Google App Engine开发 模板项目

    2. **Google App Engine**:开发者需要熟悉GAE的开发环境,如使用Google Cloud SDK进行设置,理解其服务限制(如数据存储的NoSQL数据库Bigtable,内存和CPU限制),以及如何使用GAE的调度器、监控和日志功能。...

Global site tag (gtag.js) - Google Analytics