寻呼原生SQL查询中JPA与Hibernate没有错误的关注

问题描述:

感谢,并为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一起执行,它没有问题。

非常感谢! :)

这是分页在Hibernate中完成的方式 - 使用其Dialect实现。 Dialect的API如下所示:它需要SQL查询分页和范围信息,并生成产生期望行范围的SQL语句。

如果是Oracle语言或Oracle语言,它可以使用ROWNUM并且不需要修改原始查询。在例如DB2或SQL Server一种方言需要显着改变您的查询(包括但不限于在输出中添加额外的列),以便能够为您过滤期望的范围。

最后一件事 - 为什么你的第一页或结果是不同的。 SQL允许(取决于实现)构造如SELECT TOP n,因此范围[0, n][m, n]的查询通常是不同的。