Спецификация Spring-Data-JPA с функцией агрегирования - PullRequest
0 голосов
/ 05 декабря 2018

Как мы можем написать ниже запрос, используя Спецификацию

SELECT e.id, e.name, count(e.id) 
FROM Employee e INNER JOIN Department d
WHERE e.id = d.empId;

Когда мы используем Спецификацию, она не выбирает count (), даже если она упоминается в множественном выборе.

Любая идея, каквключить столбец count в Спецификацию, когда мы используем метод JPA findAll .

Пробовал с множественным выбором, но когда он передан в спецификацию, он запрашивает только неагрегированные столбцы.

Expression<Long> countExp = cb.count(root.get("id"));
 CriteriaQuery<Employee> select =
 criteriaQuery.multiselect(root.get("id"), root.get("name"), countExp);

Но он генерирует запрос как:

SELECT e.id, e.name
FROM Employee e INNER JOIN Department d
WHERE e.id = d.empId;

Кажется, что имеет ту же проблему, что и: JpaSpecificationExecutor: сложные запросы со спецификациями

Почему мультиселектметод в JPA не работает

1 Ответ

0 голосов
/ 19 декабря 2018

Чтобы решить вышеуказанную проблему, создали собственную реализацию JPARepository и переопределите метод getQuery из SimpleJpaRepository

private TypedQuery<Employee> getQuery(Specification<Employee> spec, Sort sort) {
        CriteriaBuilder builder = this.em.getCriteriaBuilder();
        CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
        Root<Employee> root = this.applySpecificationToCriteria(spec, query);

        query.multiselect(root.get("id"), root.get("name"),
                builder.count(root.get("id")).alias("count"));

        if (sort != null) {
            query.orderBy(QueryUtils.toOrders(sort, root, builder));
        }

        return this.em.createQuery(query);
    }
...