【问题标题】:How can i convert sql query to lambda in java?如何在java中将sql查询转换为lambda?
【发布时间】:2017-01-29 02:41:53
【问题描述】:

我有一个 sql 查询。我无法将此查询转换为 lambda。你能帮我把这个查询转换成 lambda 吗?

我有一个List<Evaluator>。我想从这个列表中得到 answer.value 的平均值。按 evaluator.relationship 和 question.groupName 分组

Sql查询:

SELECT v.relationship, q.group_name, q.order_number, avg(a.value)  from evaluation e
LEFT JOIN evaluator v on e.id = v.evaluation
LEFT JOIN answer a on v.id = a.evaluator
LEFT JOIN question q ON a.question = q.id
where e.id='b19e8a34-d786-11e6-89b9-38b1dbfd82dd'
GROUP BY v.relationship, q.group_name, q.order_number
ORDER BY v.relationship, q.order_number;

实体图:

【问题讨论】:

  • 这种转变的目的是什么?我希望您不打算让客户端应用程序执行可以在数据库中更有效地完成的工作!

标签: java sql lambda java-8


【解决方案1】:
evaluators.stream()
    .flatMap(evaluator -> evaluator.getAnswers().stream())
    .collect(Collectors.groupingBy(
        answer -> new AbstractMap.SimpleEntry<>(answer.getEvaluator().getRelationship(), 
                                                answer.getQuestion().getGroupName()),
        Collectors.averagingInt(Answer::getValue)));

解释:

  • 流式传输您的评估员。
  • 对于每个评估者,平面图它回答流,以便您现在拥有Stream&lt;Answer&gt;
  • 使用Collectors.groupingBy 和组映射器收集您的答案,并减少值。
  • 对于组映射器,创建一对(使用 AbstractMap.SimpleEntryanswer.evaluator.relationshipanswer.question.groupName
  • 对于减少,使用Collectors.averagingInt 来平均当前组中的所有值。请注意,这将返回 Double

所以你最终应该得到一个Map&lt;Entry, Double&gt;。如果您愿意,也可以为键创建 String 而不是 Map.Entry,但这可能会导致大量不必要的字符串连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 2022-01-19
    • 2017-08-26
    • 1970-01-01
    • 2018-09-23
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多