JPA критерии api, количество сгруппированных строк - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно реализовать разбиение на страницы для запроса, который выглядит следующим образом:

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

, чтобы сделать это, мне нужно посчитать количество строк.Самый простой способ сделать это в SQL с помощью подзапроса on из условия:

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

Как это сделать в критериях API?Насколько я вижу, JPA не поддерживает подзапрос в предложении from (как и Hibernate).Использование нативного запроса не вариант, потому что у меня довольно сложное динамическое условие, и получение всего списка просто для получения размера кажется неправильным.

1 Ответ

0 голосов
/ 04 марта 2019

Этого можно добиться, получив список из первого запроса и определив размер списка, чтобы получить количество выбранных записей.Например:

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();
...