Вы должны использовать IdentityExtractor.INSTANCE
вместо "DoubleAverage"
в качестве значения экстрактор в GreaterFilter
, так как значение, передаваемое в этот фильтр сам по себе насчитайте зарплату, а не какой-то объект со свойством «DoubleAverage».
Но если вы хотите получить зарплату, а также счетчик (который будет соответствовать вашему SQL-запросу), вам нужно будет использовать CompositeAggregator
. В этом случае значение, переданное фильтру, больше не будет числом, а List
, и вам нужно будет использовать ValueExtractor
, который будет извлекать зарплату из этого списка. В Согласованность 12.2.1 это будет выглядеть следующим образом:
DoubleAverage<Employee> avgSalary = new DoubleAverage<>(Employee::getSalary);
Count<String, Employee> count = new Count<>();
CompositeAggregator<String, Country> compositeAggregator = CompositeAggregator
.createInstance(new InvocableMap.EntryAggregator[] { avgSalary, count });
ValueExtractor<Object, ? extends Double> salaryExtractor =
list -> ((List<Number>) list).get(0).doubleValue();
Filter having = Filters.greater(salaryExtractor, 1000.0);
GroupAggregator<String, Country, Employee, String, List> groupAggregator =
GroupAggregator.createInstance(Employee::getDepartment, compositeAggregator, having);
Это может быть сделано также в более ранних версиях, но это потребует немного больше работы для реализации salaryExtractor
без использования лямбда-выражения.