我想在Coherence中执行以下查询
Select AVG(Salary)
, Count(*)
from Employees
group by Company
Having AVG(Salary)> 1000
我正在尝试使用GroupAggregators但是我在引用avarage薪水时遇到问题,因为它没有在Employee Class中定义,而是在Aggregator中定义:
GroupAggregator high_salary = GroupAggregator.createInstance("getDepartment"
, new DoubleAverage("getSalary")
, new GreaterFilter("DoubleAverage", 1000));
我该怎么做?
答案 0 :(得分:0)
您应该使用IdentityExtractor.INSTANCE
代替"DoubleAverage"
作为GreaterFilter
中的值提取器,因为传递给此过滤器的值是avarage薪水本身,而不是某些带有" DoubleAverage&的对象#34;属性。
但是如果你想获得平均工资和数量(这与你的SQL查询一致),你将不得不使用CompositeAggregator
。在这种情况下,传递给过滤器的值将不再是数字,而是List
,您将必须使用ValueExtractor
来从此列表中提取avarage薪水。在Coherence 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);
也可以在旧版本中完成,但是在不使用lambda表达式的情况下实现salaryExtractor
还需要更多的工作。