我需要对如下查询进行分页:
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条件,而仅获取整个列表以获取大小似乎是错误的。
答案 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;
}
请注意,您不必在选择列表中包含a
和c
,因为它们已经在组列表中。 Hibernate会自动将它们放入选择列表。
要获取记录数:
List<YourTEntityClass> items= getDetails();
int count= items.size();