【问题标题】:Get Count and result in one query JPA获取计数并产生一个查询 JPA
【发布时间】:2016-02-16 09:11:48
【问题描述】:

我是 Hibernate 和 JPA 的新手。我正在尝试通过过滤实现分页。 由于这个原因,我现在使用 2 个查询:

        query = em.createQuery("SELECT l from LoanAccount l where l."+filterColumn +" LIKE :filterValue  and l.assignedBranchKey=:TaskID order by l." + orderByColumnID +" " + orrderByASC);
        q = em.createQuery("SELECT count(l.id) from LoanAccount l where l."+filterColumn +" LIKE :filterValue and l.assignedBranchKey=:TaskID");
        query.setParameter("filterValue", "%"+filterValue+"%");
        q.setParameter("filterValue", "%"+filterValue+"%");
        q.setParameter("TaskID", TaskID);
        query.setParameter("TaskID", TaskID);

        query.setFirstResult(page*count-count);
        query.setMaxResults(count);


        result.setMaxResults((Long)q.getSingleResult());
        result.setData(query.getResultList());

        return result;

所以我在第一个查询中设置了第一个和最后一个结果,所以我无法获取列表并获取它的大小。这就是为什么我创建了第二个查询并在不设置第一个和最后一个结果的情况下使用它 - 以获得分页的准确行数。

页面 - 用户现在看到的页面

count - 该页面应该有多少行

是否可以结合这两个查询?如果是,我该怎么做?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    你也可以使用ScrollableResults

    这是一个例子(代码未经测试):

    String hql = "SELECT l from LoanAccount l where l."+filterColumn +" LIKE :filterValue  and l.assignedBranchKey=:TaskID order by l." + orderByColumnID +" " + orrderByASC;
    Query query = session.createQuery(hql);
    query.setParameter("filterValue", "%"+filterValue+"%");
    query.setParameter("TaskID", TaskID);
    int pageSize = 10;
    
    ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY);
    resultScroll.first();
    resultScroll.scroll(0);
    List<LoanAccount> loanAccountPage = Lists.newArrayList();
    int i = 0;
    while (pageSize > i++) {
        loanAccountPage .add((LoanAccount ) resultScroll.get(0));
        if (!resultScroll.next())
            break;
    }
    

    【讨论】:

      【解决方案2】:

      实际上,您不能同时组合这两个查询。 但是你可以通过使用这个 JpaUtils 库来生成计数查询来节省一些代码/错误:

      Long count = JpaUtils.count(entityManager, criteriaQuery);
      

      更多信息在这里 => https://stackoverflow.com/a/9246377/5611906

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-17
        • 2012-12-30
        • 2017-11-21
        • 2013-02-23
        • 2011-08-19
        • 1970-01-01
        相关资源
        最近更新 更多