如何在java中将sql查询转换为lambda?

时间:2017-01-29 02:41:54

标签: java sql lambda java-8

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

我有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; 。我想从这个列表中得到answer.value的平均值。 Group by evaluator.relationship和question.groupName

SQL查询:

{{1}}

实体图:

enter image description here

1 个答案:

答案 0 :(得分:0)

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

说明:

  • 流式评估员。
  • 对于每个评估者,flatmap会回答流,以便您现在拥有Stream<Answer>
  • 使用Collectors.groupingBy使用群组映射器收集答案,并减少值。
  • 对于群组映射器,请创建answer.evaluator.relationshipanswer.question.groupName的对(使用AbstractMap.SimpleEntry)。
  • 对于缩减,请使用Collectors.averagingInt平均当前组中的所有值。请注意,这将返回Double

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