【发布时间】:2018-09-10 14:54:01
【问题描述】:
我有一个话题:
@Entity
public class Topic {
@Id
private int id;
private LocalDate date;
private String name;
private int points;
@JoinColumn(name = "user_id", nullable = false)
private User user;
}
我正在通过 spring data jpa 方法获取给定日期的主题列表:
列出主题 = topicRepository.findByDateBetween(begin, end); 输出有例如:
Topic(id=1, date="2018-01-01", name="Java examples", User(...), 12)
Topic(id=2, date="2018-02-02", name="Java examples", User(...), 34)
Topic(id=3, date="2018-02-02", name="Java examples", User(...), 56)
Topic(id=4, date="2018-03-03", name="Java examples", User(...), 78)
Topic(id=5, date="2018-03-03", name="Java examples", User(...), 90)
我试图实现的是将我的结果输出过滤为(如果 date && User 是相同的添加点)
Topic(id=1, date="2018-01-01", name="Java examples", User(...), 12)
Topic(id=2, date="2018-02-02", name="Java examples", User(...), 90)
Topic(id=4, date="2018-03-03", name="Java examples", User(...), 168)
我的实际解决方案返回地图,其中日期为键,总和点为值,但我需要在输出中提供更多数据,如用户或名称。
return topics.stream()
.collect(Collectors.groupingBy(Topic::getDate,
Collectors.summingInt(Topic::getPoints)));
也许有另一种方法可以代替 map return created dto 那种情况?例如
@Data
public class ResultDto {
private LocalDate date;
private String name;
private int points;
private User user;
}
【问题讨论】:
-
用户也需要相同吗?我的意思是,您是否需要按日期和用户分组,也就是说,如果
2018-02-02有 2 个用户,user 1有 10 和 5,user 2有 20 和 8,你最终会有两个组,(2018-02-02, user 1)15 和(2018-02-02, user 2)28? -
是的,我举了一个例子,当用户相同时会发生什么。但你是对的,它会像你写的那样。
-
好的,名字呢?你也需要按那个分组吗?如果不是,它不应该是
ResultDto的属性(或者这个 dto 应该有一个组成该组的所有名称的列表)。 -
您的权利。它不应该。但我们可以假设,我们也需要那个。
标签: java-8 java-stream