Я использую Spring Data для своих репозиториев и хочу иметь возможность комбинировать простые спецификации для создания сложных запросов. Это не сложная задача, используя класс Specifications
и применяя вспомогательные методы and
, or
, а затем вызывая метод findAll
класса JpaSpecificationExecutor<T>
, который принимает Specification<T>
.
Основная проблема заключается в том, что я хочу повторно использовать существующие спецификации и вместо непосредственного получения списка результатов применить к спецификации count
статистическую функцию или groupBy
статистическую функцию и получить результат статистической функции в виде Long
результат или List<Tuple>
.
Чтобы быть более конкретным, я привел простой пример:
public Specification<Person> getByNameSpec(String name) {
return (root, query, builder) -> {
return builder.equal(root.get(Person_.firstName), name);
};
}
В этом примере у меня есть метод с именем getByNameSpec
в моем классе PersonServiceImpl
, который предназначен для многократного использования. Я хочу использовать эти спецификации в трех сценариях:
- Подсчитайте количество людей по имени "Джон"
- Группа людей по имени "Джон" в другом поле, например
job
и количество каждой группы
- Выберите только одно или два поля людей с именем "Джон"
Обратите внимание, что я намерен интенсивно использовать спецификации таким образом, если эти операции возможны. Если это невозможно, как мне создать некоторые базовые критерии и повторно использовать их по всему коду?