226 lines
5.0 KiB
Markdown
226 lines
5.0 KiB
Markdown
|
|
# 获取查询结果的下一页
|
|||
|
|
|
|||
|
|
## 接口概述
|
|||
|
|
|
|||
|
|
使用 queryLocator 获取查询结果的下一页数据。当查询结果超过批次大小时,可以通过此接口分页获取剩余数据。
|
|||
|
|
|
|||
|
|
## 基本信息
|
|||
|
|
|
|||
|
|
| 属性 | 值 |
|
|||
|
|
|------|-----|
|
|||
|
|
| 接口名称 | 获取查询结果的下一页 |
|
|||
|
|
| 接口路径 | `/partner/queryMore` |
|
|||
|
|
| 请求方法 | `POST` |
|
|||
|
|
| Content-Type | `application/json` |
|
|||
|
|
| 需要认证 | 是 |
|
|||
|
|
| 所属模块 | datai-salesforce-partner |
|
|||
|
|
|
|||
|
|
## 请求参数
|
|||
|
|
|
|||
|
|
### 请求体 (Request Body)
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|
|||
|
|
|--------|------|------|------|--------|
|
|||
|
|
| queryLocator | String | 是 | 查询定位器,从 Query 或 QueryAll 的结果中获取 | `01gD0000002J6ozIAC-2000` |
|
|||
|
|
|
|||
|
|
### 请求示例
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"queryLocator": "01gD0000002J6ozIAC-2000"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 响应参数
|
|||
|
|
|
|||
|
|
### 响应体 (Response Body)
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| code | Integer | 响应状态码,200 表示成功 |
|
|||
|
|
| msg | String | 响应消息 |
|
|||
|
|
| data | Object | 响应数据 |
|
|||
|
|
|
|||
|
|
### data 对象结构
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| records | Array | 记录列表,每个记录是一个键值对对象 |
|
|||
|
|
| queryLocator | String | 查询定位器,用于继续获取下一页 |
|
|||
|
|
| done | Boolean | 是否完成(true 表示没有更多数据) |
|
|||
|
|
| size | Integer | 当前页记录数量 |
|
|||
|
|
| success | Boolean | 是否成功 |
|
|||
|
|
| errors | Array | 错误信息列表 |
|
|||
|
|
|
|||
|
|
### 响应示例
|
|||
|
|
|
|||
|
|
**成功响应(还有更多数据)**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": {
|
|||
|
|
"records": [
|
|||
|
|
{
|
|||
|
|
"Id": "001xx000003DHb4AAI",
|
|||
|
|
"Name": "Global Tech Solutions",
|
|||
|
|
"BillingCity": "Los Angeles",
|
|||
|
|
"Industry": "Technology"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"Id": "001xx000003DHb5AAJ",
|
|||
|
|
"Name": "Innovate Corp",
|
|||
|
|
"BillingCity": "Chicago",
|
|||
|
|
"Industry": "Technology"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"queryLocator": "01gD0000002J6ozIAC-4000",
|
|||
|
|
"done": false,
|
|||
|
|
"size": 2,
|
|||
|
|
"success": true,
|
|||
|
|
"errors": []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**成功响应(最后一页)**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": {
|
|||
|
|
"records": [
|
|||
|
|
{
|
|||
|
|
"Id": "001xx000003DHb6AAK",
|
|||
|
|
"Name": "Future Systems",
|
|||
|
|
"BillingCity": "Boston",
|
|||
|
|
"Industry": "Technology"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"queryLocator": null,
|
|||
|
|
"done": true,
|
|||
|
|
"size": 1,
|
|||
|
|
"success": true,
|
|||
|
|
"errors": []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**错误响应**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 500,
|
|||
|
|
"msg": "QueryMore 查询失败: Invalid query locator",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 错误码
|
|||
|
|
|
|||
|
|
| 错误码 | 说明 | 处理建议 |
|
|||
|
|
|--------|------|----------|
|
|||
|
|
| 400 | 请求参数错误 | 检查 queryLocator 是否有效 |
|
|||
|
|
| 401 | 认证失败 | 检查 Salesforce 认证信息是否有效 |
|
|||
|
|
| 404 | 查询定位器不存在 | queryLocator 可能已过期或无效 |
|
|||
|
|
| 500 | 服务器内部错误 | 检查 queryLocator 格式是否正确 |
|
|||
|
|
|
|||
|
|
## 使用说明
|
|||
|
|
|
|||
|
|
### 分页查询流程
|
|||
|
|
|
|||
|
|
1. **首次查询**
|
|||
|
|
|
|||
|
|
调用 `query` 或 `queryAll` 接口获取第一批数据:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"soql": "SELECT Id, Name, BillingCity FROM Account",
|
|||
|
|
"batchSize": 500
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查是否还有更多数据**
|
|||
|
|
|
|||
|
|
查看响应中的 `done` 字段:
|
|||
|
|
- `done: false` - 还有更多数据
|
|||
|
|
- `done: true` - 已获取所有数据
|
|||
|
|
|
|||
|
|
3. **获取下一页**
|
|||
|
|
|
|||
|
|
如果 `done` 为 false,使用返回的 `queryLocator` 调用 `queryMore`:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"queryLocator": "01gD0000002J6ozIAC-2000"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **重复步骤 2-3**
|
|||
|
|
|
|||
|
|
直到 `done` 为 true。
|
|||
|
|
|
|||
|
|
### 完整分页示例
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 伪代码示例
|
|||
|
|
let queryLocator = null;
|
|||
|
|
let allRecords = [];
|
|||
|
|
|
|||
|
|
// 首次查询
|
|||
|
|
const firstResult = await query({
|
|||
|
|
soql: "SELECT Id, Name FROM Account",
|
|||
|
|
batchSize: 500
|
|||
|
|
});
|
|||
|
|
allRecords = allRecords.concat(firstResult.data.records);
|
|||
|
|
queryLocator = firstResult.data.queryLocator;
|
|||
|
|
|
|||
|
|
// 循环获取剩余数据
|
|||
|
|
while (queryLocator && !firstResult.data.done) {
|
|||
|
|
const result = await queryMore({ queryLocator });
|
|||
|
|
allRecords = allRecords.concat(result.data.records);
|
|||
|
|
queryLocator = result.data.queryLocator;
|
|||
|
|
|
|||
|
|
if (result.data.done) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log(`总共获取 ${allRecords.length} 条记录`);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 注意事项
|
|||
|
|
|
|||
|
|
1. **queryLocator 有效期**
|
|||
|
|
- queryLocator 在查询会话期间有效
|
|||
|
|
- 会话超时后 queryLocator 会失效
|
|||
|
|
- 建议在合理时间内完成分页查询
|
|||
|
|
|
|||
|
|
2. **批次大小**
|
|||
|
|
- 首次查询的 batchSize 决定每页的记录数
|
|||
|
|
- queryMore 无法修改批次大小
|
|||
|
|
- 建议根据实际需求设置合适的批次大小
|
|||
|
|
|
|||
|
|
3. **性能优化**
|
|||
|
|
- 避免一次性获取过多数据
|
|||
|
|
- 根据业务需求合理设置批次大小
|
|||
|
|
- 考虑使用更精确的查询条件减少数据量
|
|||
|
|
|
|||
|
|
4. **错误处理**
|
|||
|
|
- 捕获并处理 queryLocator 过期的情况
|
|||
|
|
- 当 queryLocator 失效时,需要重新执行初始查询
|
|||
|
|
|
|||
|
|
## 相关接口
|
|||
|
|
|
|||
|
|
- [执行 SOQL 查询](./001-query.md)
|
|||
|
|
- [查询所有记录(包括已删除的)](./002-query-all.md)
|
|||
|
|
- [执行 SOSL 搜索](./004-search.md)
|
|||
|
|
|
|||
|
|
## 更新日志
|
|||
|
|
|
|||
|
|
| 版本 | 日期 | 更新内容 | 作者 |
|
|||
|
|
|------|------|----------|------|
|
|||
|
|
| 1.0.0 | 2026-01-30 | 初始版本 | AI Assistant |
|