【问题标题】:Paging Native SQL Query in JPA with Hibernate without error使用 Hibernate 在 JPA 中分页本机 SQL 查询而不会出错
【发布时间】:2012-02-22 17:49:30
【问题描述】:

感谢您的关注,抱歉 mi English :S

我正在使用 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执行的,没有问题。

非常感谢!! :)

【问题讨论】:

    标签: java hibernate jpa nativequery


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2020-10-30
      • 2017-05-13
      • 1970-01-01
      • 2017-04-14
      相关资源
      最近更新 更多