JPA之EntityManager两种group方法

JPA对group的支持,其实并不太好。笔者选择了两种方法进行操作。

一种方法是采用原生的SQL语句。但使用此种方法需要注意如下问题:就是当被选择项(select的项目)本身不在group里,且没有聚合函数时,会产生错误。 PS:max、count、avg、min、sum函数等分组统计的函数,称为聚合函数。

因此,必须保证被选择项与group项对应,如下所示:

select A, B, max(C) ... group by A, B

另一种方法是使用Stream功能进行group。值得注意的是,Stream的group分组后,会生成一个Map。可以在Map里进行统计和执行操作。

类似过程如下:

Map<Pair<String, String>, List<Item>> mapDB = db
	.stream()
	.collect(Collectors.groupingBy(s -> Pair.of(s.k1,  s.k2)));

List<Item> db = new LinkedList();

for(Pair<String, String> pair: mapDB.keySet()){
	Item payOnSumInfoItem = new Item();
	Item.k1 = pair.getFirst();
	Item.k2 = pair.getSecond();
	Item.content = mapDB.get(pair).stream().mapToDouble(n -> n.how.doubleValue()).sum();
}
经验分享 程序员 微信小程序 职场和发展