【问题标题】:JPA criteria api, count number of grouped rowsJPA标准api,计数分组行数
【发布时间】:2019-07-13 23:27:47
【问题描述】:

我需要对如下所示的查询实现分页:

select a,b,c, sum(b) from t group by a,b,c

为了做到这一点,我需要计算行数。在 SQL 中最简单的方法是在 from 子句上使用子查询:

select count(*) from select a,b,c sum(d) from t group by a,b,c

如何在标准 api 中做到这一点?据我所知,JPA 不支持 from 子句中的子查询(Hibernate 也不支持)。使用本机查询不是一个选项,因为我有相当复杂的动态 where 条件,并且获取整个列表只是为了获取大小似乎是错误的。

【问题讨论】:

  • 如果您要求 JPA Criteria API,为什么要使用 hibernate-criteria 标签标记问题?
  • 另外,通过添加实体类的基本部分以及您迄今为止尝试过的内容来改进您的问题
  • 如果它是休眠标准或标准 api 对我来说真的没那么重要(即使首选 JPA 方法,我也可以同时使用这两种方法)。我需要的是能够从数据库中获取聚合行数,并能够限制结果集的开头和结尾(setFirstResult(int), setMaxResult(int))

标签: hibernate jpa hibernate-criteria criteria-api


【解决方案1】:

您可以通过从第一个查询中获取一个 List 并确定 List 的大小以得出获取的记录数来实现这一点。 例如:

public static List<YourTEntityClass> getDetails() {
        List<YourTEntityClass> items= null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(YourTEntityClass.class);
            cr.setProjection(Projections.projectionList()
            .add(Projections.sum("b"))
            .add(Projections.groupProperty("a"))
            .add(Projections.groupProperty("c")));
            items = cr.list();
            tx.commit();
        } catch (HibernateException asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }
        return items;
    }

请注意,您不需要在选择列表中包含 ac,因为它们已经在组列表中。 Hibernate 自动将它们放入选择列表中。

获取记录数:

List<YourTEntityClass> items= getDetails();
int count= items.size();

【讨论】:

  • 这不是 JPA 标准 API,它是 Hibernate Criteria(顺便说一句,现在不赞成使用 JPA 标准 API)
  • 问题是这样标记的。
  • 好吧,让我们等到提问者澄清。然而,除了标签之外,这个问题明确提到了 JPA,你不觉得吗?
  • 即便如此,我标记为YourTEntityClass 的对象也需要属于javax.persistence.Entity 类型
  • 正如我在原始帖子中所说,获取整个列表(约 50k 行)只是为了向客户端发送 100 行(并且这样做 500 次以获得整个列表)似乎完全错误。我想做的是能够在数据库端切片结果集。在 SQL 中执行此操作很简单,但在 JPA 中则不然。
猜你喜欢
  • 2018-08-22
  • 1970-01-01
  • 2011-09-06
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多