2012-01-30 18 views
2

感謝,併爲MI英語遺憾:S尋呼原生SQL查詢中JPA與Hibernate沒有錯誤的關注

我使用JPA 2.0與Hibernate 4.X做一些SQL本機查詢。特碼是很簡單的:

private void doIt() throws Exception { 
     EntityManager em = getEntityManager(); 
     Query q = em.createNativeQuery("A very simple native query, which return no entities, but collections of arrays"); 
     q.setFirstResult(0); 
     q.setMaxResults(5); 
     Collection<Object> results = q.getResultList(); 
     System.out.println("1"); //Means page 1 
     for (Object elem : results) { 
      String line = ""; 
      Object[] row = (Object[]) elem; 
      for (Object object : row) { 
       if(object==null){ 
        object="null"; 
       } 
       line += object +"("+object.getClass()+")"+ ","; 
      } 
      System.out.println(row.length + " " + line); 

     } 


     em = getEntityManager(); 
     q = em.createNativeQuery("The same simple native query, which return no entities, but collections of arrays"); 
     q.setFirstResult(5); 
     q.setMaxResults(5); 
     results = q.getResultList(); 
     System.out.println("2"); //Means page 2 
     for (Object elem : results) { 
      String line = ""; 
      Object[] row = (Object[]) elem; 
      for (Object object : row) { 
       if(object==null){ 
        object="null"; 
       } 
       line += object +"("+object.getClass()+")"+ ","; 
      } 
      System.out.println(row.length + " " + line); 

     } 


     em = getEntityManager(); 
     q = em.createNativeQuery("The same simple native query, which return no entities, but collections of arrays"); 
     q.setFirstResult(10); 
     q.setMaxResults(5); 
     results = q.getResultList(); 
     System.out.println("3"); //Means page 3 
     for (Object elem : results) { 
      String line = ""; 
      Object[] row = (Object[]) elem; 
      for (Object object : row) { 
       if(object==null){ 
        object="null"; 
       } 
       line += object +"("+object.getClass()+")"+ ","; 
      } 
      System.out.println(row.length + " " + line); 

     } 
    } 

我的結果是這樣的:

1 
data1,data2,...,data-n  -->I need this output 
data1,data2,...,data-n 
data1,data2,...,data-n 
data1,data2,...,data-n 
data1,data2,...,data-n 

2 
data1,data2,...,data-n,6  -->OMG! lol 
data1,data2,...,data-n,7 
data1,data2,...,data-n,8 
data1,data2,...,data-n,9 
data1,data2,...,data-n,10 

3 
data1,data2,...,data-n,11 
data1,data2,...,data-n,12 
data1,data2,...,data-n,13 
data1,data2,...,data-n,14 
data1,data2,...,data-n,15 

總之,在第一頁的輸出有每行n項(這是我所希望輸出),但第二第三頁有n + 1個項目,而附加項目似乎是所帶行的編號。

有人發生過同樣的事情嗎?我在Hibernate的文檔中搜索過,但是我無法解決這個「有趣:@」的問題。

此代碼與Toplink一起執行,它沒有問題。

非常感謝! :)

回答

4

這是分頁在Hibernate中完成的方式 - 使用其Dialect實現。 Dialect的API如下所示:它需要SQL查詢分頁和範圍信息,並生成產生期望行範圍的SQL語句。

如果是Oracle語言或Oracle語言,它可以使用ROWNUM並且不需要修改原始查詢。在例如DB2或SQL Server一種方言需要顯着改變您的查詢(包括但不限於在輸出中添加額外的列),以便能夠爲您過濾期望的範圍。

最後一件事 - 爲什麼你的第一頁或結果是不同的。 SQL允許(取決於實現)構造如SELECT TOP n,因此範圍[0, n][m, n]的查詢通常是不同的。