Couchbase N1QL Java SDK 分页和排序问题
Couchbase N1QL Java SDK Pagination and Sorting issue
我最近开始使用couchbase。我正在使用 Spring-Data couchbase 在 Couchbase 中插入 Java POJO。由于 Spring Data Couchbase 项目不支持分页和排序,我尝试使用 couchbase java 客户端 2.2.0-dp2.
我插入了 8 个用户,ID 范围从 1 到 8。
我编写了以下代码来应用分页和排序。
public void test() {
int offset = 5 * (1 - 1);
Statement statement = select("*").from("test").where(x("_class").eq(s("com.test.rest.entity.User"))).orderBy(Sort.asc("id")).limit(5).offset(offset);
log.info(statement.toString());
Iterator<QueryRow> result = bucket.query(Query.simple(statement)).rows();
while(result.hasNext()) {
QueryRow doc = result.next();
log.info("Document:: " + doc.value());
}
}
但是,我看到的结果如下。它应该是 test1 到 test5,尽管用户是随机选择的。有人可以帮我吗?
Document:: {“test":{"createdAt":1.443420400374E12,"firstname":"test5","_class":"com.test.rest.entity.User","type":"User","lastname":"test5"}}
Document:: {“test":{"createdAt":1.443420708495E12,"firstname":"test8","_class":"com.test.rest.entity.User","type":"User","lastname":"test8"}}
Document:: {“test:{"createdAt":1.443420386638E12,"firstname":"test2","_class":"com.test.rest.entity.User","type":"User","lastname":"test2"}}
Document:: {“test":{"createdAt":1.443420704104E12,"firstname":"test7","_class":"com.test.rest.entity.User","type":"User","lastname":"test7"}}
Document:: {“test":{"createdAt":1.443420379712E12,"firstname":"test1","_class":"com.test.rest.entity.User","type":"User","lastname":"test1"}}
It should be test1 to test5, though users being selected randomly
您似乎希望按名字排序,因为 ID 是由 CB 生成的。
尝试用 "firstname" 替换 "id",例如:
Statement statement = select("*").from("test").where(x("_class")
.eq(s("com.test.rest.entity.User")))
.orderBy(Sort.asc("firstname")).limit(5).offset(offset);
注意: 我怀疑字段名称 "id" 与元数据的 ID 冲突(因此未在您的 json 结果中返回)。尝试以不同的方式命名,例如“_id”、"id#" 等。
通过 Spring Data Couchbase 代码库后,我弄清楚了他们查询 n1ql 的方式。默认情况下 select(*) 不 select id 因为 id 不是文档的一部分。所以,
N1QL 语句:
SELECT META(`test`).id AS _ID, META(`test`).cas AS _CAS, `test`.* FROM `test` WHERE `_class` = "com.test.rest.entity.User";
Couchbase Java 客户端代码:
Statement statement = select("META(`test`).id AS _ID, META(`test`).cas AS _CAS, `test`.*").from("test").where(x("_class").eq(s("com.test.rest.entity.User"))).orderBy(Sort.asc("_ID")).limit(5).offset(offset);
注意: orderBy(Sort.asc("_ID")) 不是必需的。我只是留作样品。
我最近开始使用couchbase。我正在使用 Spring-Data couchbase 在 Couchbase 中插入 Java POJO。由于 Spring Data Couchbase 项目不支持分页和排序,我尝试使用 couchbase java 客户端 2.2.0-dp2.
我插入了 8 个用户,ID 范围从 1 到 8。
我编写了以下代码来应用分页和排序。
public void test() {
int offset = 5 * (1 - 1);
Statement statement = select("*").from("test").where(x("_class").eq(s("com.test.rest.entity.User"))).orderBy(Sort.asc("id")).limit(5).offset(offset);
log.info(statement.toString());
Iterator<QueryRow> result = bucket.query(Query.simple(statement)).rows();
while(result.hasNext()) {
QueryRow doc = result.next();
log.info("Document:: " + doc.value());
}
}
但是,我看到的结果如下。它应该是 test1 到 test5,尽管用户是随机选择的。有人可以帮我吗?
Document:: {“test":{"createdAt":1.443420400374E12,"firstname":"test5","_class":"com.test.rest.entity.User","type":"User","lastname":"test5"}}
Document:: {“test":{"createdAt":1.443420708495E12,"firstname":"test8","_class":"com.test.rest.entity.User","type":"User","lastname":"test8"}}
Document:: {“test:{"createdAt":1.443420386638E12,"firstname":"test2","_class":"com.test.rest.entity.User","type":"User","lastname":"test2"}}
Document:: {“test":{"createdAt":1.443420704104E12,"firstname":"test7","_class":"com.test.rest.entity.User","type":"User","lastname":"test7"}}
Document:: {“test":{"createdAt":1.443420379712E12,"firstname":"test1","_class":"com.test.rest.entity.User","type":"User","lastname":"test1"}}
It should be test1 to test5, though users being selected randomly
您似乎希望按名字排序,因为 ID 是由 CB 生成的。
尝试用 "firstname" 替换 "id",例如:
Statement statement = select("*").from("test").where(x("_class")
.eq(s("com.test.rest.entity.User")))
.orderBy(Sort.asc("firstname")).limit(5).offset(offset);
注意: 我怀疑字段名称 "id" 与元数据的 ID 冲突(因此未在您的 json 结果中返回)。尝试以不同的方式命名,例如“_id”、"id#" 等。
通过 Spring Data Couchbase 代码库后,我弄清楚了他们查询 n1ql 的方式。默认情况下 select(*) 不 select id 因为 id 不是文档的一部分。所以,
N1QL 语句:
SELECT META(`test`).id AS _ID, META(`test`).cas AS _CAS, `test`.* FROM `test` WHERE `_class` = "com.test.rest.entity.User";
Couchbase Java 客户端代码:
Statement statement = select("META(`test`).id AS _ID, META(`test`).cas AS _CAS, `test`.*").from("test").where(x("_class").eq(s("com.test.rest.entity.User"))).orderBy(Sort.asc("_ID")).limit(5).offset(offset);
注意: orderBy(Sort.asc("_ID")) 不是必需的。我只是留作样品。