JPA条件api,计算分组行数

时间:2019-02-20 09:59:46

标签: hibernate jpa hibernate-criteria criteria-api

我需要对如下查询进行分页:

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条件,而仅获取整个列表以获取大小似乎是错误的。

1 个答案:

答案 0 :(得分:0)

您可以通过从第一个查询中获取一个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();