为什么 Java N1QL 中的 ORDER BY 没有按预期工作
Why ORDER BY in Java N1QL not working as intended
当我 运行 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);
}
Web UI 结果
[
{
"projects": {
"createdAt": 1603804921950,
"name": "Third Project",
...
}
},
{
"projects": {
"createdAt": 1603804915827,
"name": "Second Project",
...
}
},
{
"projects": {
"createdAt": 1603804909410,
"name": "First Project"
...
}
}
]
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",
...
}
]
当我将语句更改为此时,它可以正确排序,但为什么使用 put
方法排序不正确。
String statement = "SELECT projects.* FROM projects ORDER BY " + requestedOrder + " DESC OFFSET $offset LIMIT $pageOffset";
String statement = "SELECT projects.* FROM projects ORDER BY $requestedOrder DESC OFFSET $offset LIMIT $pageOffset";
在上面的查询中,您将 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";
当我 运行 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);
}
Web UI 结果
[
{
"projects": {
"createdAt": 1603804921950,
"name": "Third Project",
...
}
},
{
"projects": {
"createdAt": 1603804915827,
"name": "Second Project",
...
}
},
{
"projects": {
"createdAt": 1603804909410,
"name": "First Project"
...
}
}
]
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",
...
}
]
当我将语句更改为此时,它可以正确排序,但为什么使用 put
方法排序不正确。
String statement = "SELECT projects.* FROM projects ORDER BY " + requestedOrder + " DESC OFFSET $offset LIMIT $pageOffset";
String statement = "SELECT projects.* FROM projects ORDER BY $requestedOrder DESC OFFSET $offset LIMIT $pageOffset";
在上面的查询中,您将 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";