文章目录
  1. 1. 前言
  2. 2. 更新内容
    1. 2.1. selectSumByDynamicQuery
      1. 2.1.1. 越界处理
    2. 2.2. selectAvgByDynamicQuery
      1. 2.2.1. 失精度处理
  3. 3. 小结

项目地址: 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();
// 为了验证sum 对不对 我们把所有数据拿出来在内存sum 一下
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();
// 为了验证avg 对不对 我们把所有数据拿出来在内存avg 一下
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

小结

现在都在做一些修修补补,希望下次有个大功能上线,还有大家在疫情下都保护好自己。

文章目录
  1. 1. 前言
  2. 2. 更新内容
    1. 2.1. selectSumByDynamicQuery
      1. 2.1.1. 越界处理
    2. 2.2. selectAvgByDynamicQuery
      1. 2.2.1. 失精度处理
  3. 3. 小结