Абстракция репозитория позволяет вам управлять сохранением агрегата с помощью фасада, похожего на коллекцию, но обобщенные методы c могут возвращать только объекты типа агрегата.
При выполнении агрегирования данных, как в вашем случае, вы возвращаете не агрегат, а отдельные столбцы и результаты агрегации. Это несовместимо с обобщенными c репозиториями методами и спецификациями объектов.
Чтобы достичь того, что вы хотите, вы должны определить собственный метод репозитория. Определите его в пользовательском интерфейсе:
public interface ProductRepository extends Repository<Product, Long> {
int getMaximumProductPrice();
}
Затем реализуйте его:
public class ProductJpaRepository
extends BaseJpaRepository<Product, Long>
implements ProductRepository {
@Override
public int getMaximumProductPrice() {
// implement query using getEntityManager()
}
}
Теперь вы напрямую добавляете в свой репозиторий собственный интерфейс:
public class SomeClass {
@Inject
private SomeRepository someRepository;
}
Приведенный выше пример очень прост, но обратите внимание, что вы также можете возвращать более сложные значения, такие как:
- Массив
Object
для хранения произвольных значений, - Пользовательский объект, предназначенный для хранения всех возвращаемые значения,
- A
Product
или список Product
, если вы выполняете объединение.