16 марта 2019

Для выполнения условной логики в SQL SELECT, можно использовать выражение CASE. Следующий SQL хак позволит вам выполнить условный count() для вашего запроса.

Например, чтобы выбрать количество записей с id > 5:

SQL:

SELECT SUM(CASE WHEN id > 5 THEN 1 ELSE 0 END) FROM Table

JPQL:

entityManager.createQuery("SELECT SUM(CASE WHEN b.id > 5 THEN 1 ELSE 0 END) FROM BlogEntity b").getSingleResult()

Criteria API:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Number> query = cb.createQuery(Number.class);
Root<BlogEntity> blogEntity = query.from(BlogEntity.class);

query.select(
        cb.sum(
                cb.<Number>selectCase()
                        .when(cb.gt(blogEntity.get("id"), 5), 1)
                        .otherwise(0)
        )
);

Number result = em.createQuery(query).getSingleResult();

Исходный код, доступен на GitHub