【问题标题】:Aggregation function on result table consisting of data from multiple tables using Speedment使用 Speedment 对包含来自多个表的数据的结果表进行聚合函数
【发布时间】:2019-04-29 19:05:35
【问题描述】:

我完全不知道如何使用 Speedment 框架将此 sql 查询转换为 Java Streams。 Java 中的“结果表”可以是任何类型(可以是 Map 甚至是专门定义的用户类)。

这是我试图翻译成 Java 流的 sql 查询:

SELECT d.dept_name, AVG(s.salary)
FROM employees e
JOIN salaries s
ON e.emp_no=s.emp_no
JOIN dept_emp de ON de.emp_no = e.emp_no
JOIN  departments d ON d.dept_no=de.dept_no
WHERE s.to_date = '9999-01-01' AND de.to_date = '9999-01-01'
GROUP BY d.dept_name;

DB Scheme which I'm using
来源:https://github.com/datacharmer/test_db/tree/master/images

提前致谢。

【问题讨论】:

    标签: speedment


    【解决方案1】:

    感谢 Youtube 上的 Speedment 频道,我找到了解决方案。

    1) 为聚合创建一个“Result/Wrapper”类:

    private static class Result {
            private Double salary;
            private String departmentName;
    
            public Double getSalary() { return salary; }
            public void setSalary(Double salary) { this.salary = salary; }
            public String getDepartmentName() { return departmentName; }
            public void setDepartmentName(String departmentName) {
                this.departmentName = departmentName;
            }
    
            @Override
            public String toString() {
                return "Result{" +
                        "salary=" + salary +
                        ", departmentName='" + departmentName + '\'' +
                        '}';
            }
        }
    

    2) 创建一个连接对象:

    Join<Tuple2<Departments, Salaries>> join = app.getOrThrow(JoinComponent.class)
                    .from(EmployeesManager.IDENTIFIER)
                    .innerJoinOn(DeptEmp.EMP_NO).equal(Employees.EMP_NO)
                        .where(DeptEmp.TO_DATE.equal(Date.valueOf("9999-01-01")))
                    .innerJoinOn(Departments.DEPT_NO).equal(DeptEmp.DEPT_NO)
                    .innerJoinOn(Salaries.EMP_NO).equal(Employees.EMP_NO)
                        .where(Salaries.TO_DATE.equal(Date.valueOf("9999-01-01")))
                    .build((a,b,c,d) -> Tuples.of(c,d));
    

    3) 创建聚合规则:

    AggregationCollector<Tuple2<Departments, Salaries>, ?, Result> aggregationCollector = Aggregator.builder(Result::new)
                                .firstOn(Tuple2.<Departments, Salaries>getter0())
                                    .andThen(Departments.DEPT_NAME)
                                    .key(Result::setDepartmentName)
                                .firstOn(Tuple2.getter1())
                                    .andThen(Salaries.SALARY)
                                    .average(Result::setSalary)
                                .build()
                                .createCollector();
    

    4) 创建一个聚合对象:

    Aggregation<Result> aggregation = join.stream().collect(aggregationCollector);
    

    5) 随心所欲:

    aggregation.streamAndClose().forEachOrdered(System.out::println);
    

    输出:

    Result{salary=67657.91955820487, departmentName='Development'}
    Result{salary=78559.93696229013, departmentName='Finance'}
    Result{salary=67843.30198484214, departmentName='Production'}
    Result{salary=80058.84880743832, departmentName='Marketing'}
    Result{salary=63921.89982943111, departmentName='Human Resources'}
    Result{salary=88852.96947030538, departmentName='Sales'}
    Result{salary=67285.23017815467, departmentName='Customer Service'}
    Result{salary=67913.3749757136, departmentName='Research'}
    Result{salary=65441.99340024768, departmentName='Quality Management'}
    

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 2019-12-03
      • 1970-01-01
      • 2021-09-26
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多