2015-09-28 66 views
1

我最近開始使用couchbase。我正在使用Spring-Data couchbase在Couchbase中插入Java POJO。由於Spring Data Couchbase項目不支持分頁和排序,因此我嘗試使用couchbase java客戶端2.2.0-dp2。Couchbase N1QL Java SDK分頁和排序問題

我已插入其中的ID取值範圍爲1到8

我已經寫了下面的代碼來應用分頁和排序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來測試5。有人可以幫助我嗎?

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"}} 

回答

0

通過Spring數據Couchbase代碼庫,我找出他們查詢n1ql的方式。默認情況下,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); 

注:排序依據(Sort.asc( 「_ ID」))不要求。我只是保留了它的樣本。

0

應該TEST1到TEST5,雖然隨機被選中的用戶

看起來像你期望的名字排序,因爲由CB生成的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」與元數據的ID碰撞(因此不在您的JSON結果返回)。嘗試命名它不同,如「_id」,「ID#」等。

+0

沒有。事實並非如此。在創建記錄的同時,我依次設置ID,並且ID很長。 「測試」後我附加了相同的ID。我們也可以通過排序,但記錄仍然是隨機的。 –

+0

瞭解。爲什麼然後在你的查詢輸出中不存在id屬性?也許這就是問題所在? – user1697575

+0

好點。 QueryRow類具有返回JsonObject的value()方法,但不包含id字段。此外,我嘗試對createdAt進行排序,並按預期進行分頁工作。但是,我仍然想知道爲什麼id不會作爲json的一部分返回。我想這會幫助我獲得解決方案。感謝幫助的人。真的很感激它。 –