By
wz2cool
更新日期:
项目地址: mybatis-dynamic-query
前言
更新版本到 3.1.14, 距离上次 3.1.7 又花了半年年,期间有种种客观原因,可能因为工作上的事情太忙,有些偷懒了,除了之前聊到的逻辑分页,这次在上个版本基础加上两个聚合函数 selectSumByDynamicQuery, selectAvgByDynamicQuery
更新内容
selectSumByDynamicQuery
对某个列进行 sum 操作。
1 2 3 4 5 6 7 8 9 10
| @Test public void testSelectSum() { DynamicQuery<Product> query1 = DynamicQuery.createQuery(Product.class); Optional<BigDecimal> sumOptional = productDao.selectSumByDynamicQuery(Product::getPrice, query1); BigDecimal sum = sumOptional.get(); List<Product> productList = productDao.selectAll(); BigDecimal expectedValue = new BigDecimal(productList.stream().mapToDouble(x -> x.getPrice().doubleValue()).sum()); assertEquals(0, expectedValue.compareTo(sum)); }
|
我们同样看一下输出日志
1 2 3 4 5
| ==> Preparing: SELECT SUM(price) FROM product ==> Parameters: <== Columns: SUM(PRICE) <== Row: 75.0000 <== Total: 1
|
越界处理
在 Sum 的时候为了保证不越界,字段类型 和返回值对应关系为
- byte -> Long
- Short -> Long
- Integer -> Long
- Long -> Long
- Double -> BigDecimal
- Float -> BigDecimal
- BigDecimal -> BigDecimal
selectAvgByDynamicQuery
对某个列进行 avg 操作(计算平均值)。
1 2 3 4 5 6 7 8 9 10
| @Test public void testSelectAvg() { DynamicQuery<Product> query1 = DynamicQuery.createQuery(Product.class); Optional<BigDecimal> avgOptional = productDao.selectAvgByDynamicQuery(Product::getPrice, query1); BigDecimal sum = avgOptional.get(); List<Product> productList = productDao.selectAll(); BigDecimal expectedValue = new BigDecimal(productList.stream().mapToDouble(x -> x.getPrice().doubleValue()).average().getAsDouble()); assertEquals(0, expectedValue.compareTo(sum)); }
|
我们同样看一下输出日志
1 2 3 4 5
| ==> Preparing: SELECT AVG(price) FROM product ==> Parameters: <== Columns: AVG(PRICE) <== Row: 15 <== Total: 1
|
失精度处理
比如整型做完平均值会变成小数,所以我们把所有返回值变成 BigDecimal
- byte -> BigDecimal
- Short -> BigDecimal
- Integer -> BigDecimal
- Long -> BigDecimal
- Double -> BigDecimal
- Float -> BigDecimal
- BigDecimal -> BigDecimal
小结
现在都在做一些修修补补,希望下次有个大功能上线,还有大家在疫情下都保护好自己。