为什么 Java N1QL 中的 ORDER BY 无法按预期工作

Ber*_*mez 3 java couchbase spring-boot spring-data-couchbase sql++

当我SELECT * FROM projects ORDER BY createdAt desc在 Couchbase Web UI 中运行此查询时,结果按原样排序,但不是在 Java 中。

Java代码

@Override
    public List<Project> getAllProjects(String requestedOrder, Integer page, Integer pageOffset) {
        String statement = "SELECT projects.* FROM projects ORDER BY $requestedOrder DESC OFFSET $offset LIMIT $pageOffset";
        QueryOptions queryOptions = queryOptions().parameters(
                JsonObject.create().put("offset", (page - 1) * pageOffset)
                        .put("pageOffset", pageOffset)
                        .put("requestedOrder", requestedOrder));
        QueryResult queryResult = couchbaseCluster.query(statement, queryOptions);
        return queryResult.rowsAs(Project.class);
    }
Run Code Online (Sandbox Code Playgroud)

网页界面结果

[
  {
    "projects": {
      "createdAt": 1603804921950,
      "name": "Third Project",
      ...
    }
  },
  {
    "projects": {
      "createdAt": 1603804915827,
      "name": "Second Project",
      ...
    }
  },
  {
    "projects": {
      "createdAt": 1603804909410,
      "name": "First Project"
      ...
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

Java SDK 结果

[
  {
    "name": "Second Project",
    "createdAt": "2020-10-27T13:21:55.827+00:00",
    ...
  },
  {
    "name": "Third Project",
    "createdAt": "2020-10-27T13:22:01.950+00:00",
    ...
  },
  {
    "name": "First Project",
    "createdAt": "2020-10-27T13:21:49.410+00:00",
    ...
  }
]
Run Code Online (Sandbox Code Playgroud)

当我将我的声明更改为此时,它会正确排序,但为什么使用put方法无法正确排序。

String statement = "SELECT projects.* FROM projects ORDER BY " + requestedOrder + " DESC OFFSET $offset LIMIT $pageOffset";
Run Code Online (Sandbox Code Playgroud)

vsr*_*vsr 6

String statement = "SELECT projects.* FROM projects ORDER BY $requestedOrder DESC OFFSET $offset LIMIT $pageOffset";
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,您将 ORDER BY 表达式作为命名参数传递,即值。对于查询中的所有文档,该值将保持不变且相同。按相同值排序是 NOOP,即它可能不排序任何内容。

ORDER BY 表达式必须依赖于文档的字段。每次如果您需要不同的字段,则必须使用不同的查询。

注意:JSON 是模式较少,并且没有字段的物理位置。ORDER BY 数字将视为常量,而某些 RDBS 数据库使用投影字段位置作为排序。

如果 $requestedOrder 不是嵌套字段,请尝试将查询字符串替换为以下内容。$requestedOrder 必须计算为字符串并且必须是文档的字段(非嵌套)。示例 $requestedOrder = "createdAt" 排序执行期间评估 p.createdAt(即与 ORDER BY p.createdAt 相同)

 String statement = "SELECT p.* FROM projects AS p ORDER BY p.[$requestedOrder] DESC OFFSET $offset LIMIT $pageOffset";
Run Code Online (Sandbox Code Playgroud)