更新版本到 3.1.7,这次主要是一个小版本的更新,加了三个比较有用的方法,selectFirstByDynamicQuery, selectMaxByDynamicQuery, selectMinByDynamicQuery
选择第一个, 这个和 selectOne 要区别开来,selectOne 是有且只有个一个,多了要报错,selectFirst 是你有多个也没关系,但是我只取第一个
@Test
public void testSelectFirst() {
DynamicQuery<ProductsDO> query = DynamicQuery.createQuery(ProductsDO.class)
.and(ProductsDO::getId, greaterThan(2))
.orderBy(ProductsDO::getId, asc());
// 因为过滤掉了2 , 再按照id 升序,那么第二个id值一定是3
Optional<ProductsDO> productsDOOptional = productMapper.selectFirstByDynamicQuery(query);
Assert.assertTrue(productsDOOptional.isPresent());
Integer expectedValue = 3;
Integer actualValue = productsDOOptional.get().getId();
Assert.assertEquals(expectedValue, actualValue);
}
选择最大值,这个就比较好理解了,就是调用 max 函数
@Test
public void testSelectMax() {
// 查看最大值的比较可以用,我们倒叙获得的值和最大值进行比较
// 直接用max 函数获取价格最大值
DynamicQuery<ProductsDO> selectMaxQuery = DynamicQuery.createQuery(ProductsDO.class)
.and(ProductsDO::getId, greaterThan(10));
Optional<BigDecimal> maxPriceOptional =
productMapper.selectMaxByDynamicQuery(ProductsDO::getListPrice, selectMaxQuery);
Assert.assertTrue(maxPriceOptional.isPresent());
BigDecimal actualMaxPrice = maxPriceOptional.get();
// 间接倒叙获得价格最大值
DynamicQuery<ProductsDO> selectFirstQuery = DynamicQuery.createQuery(ProductsDO.class)
.select(ProductsDO::getListPrice)
.and(ProductsDO::getId, greaterThan(10))
.orderBy(ProductsDO::getListPrice, desc());
Optional<ProductsDO> productsDOOptional = productMapper.selectFirstByDynamicQuery(selectFirstQuery);
Assert.assertTrue(productsDOOptional.isPresent());
BigDecimal expectedMaxPrice = productsDOOptional.get().getListPrice();
Assert.assertEquals(expectedMaxPrice, actualMaxPrice);
}
我们也可以看一下日志输出
-- 12 2019-11-20 22:51:57.634 DEBUG 11812 --- [ main] c.g.w.m.m.P.selectMaxByDynamicQuery : ==>
SELECT MAX(list_price)
FROM products
WHERE (id > 10);
------------------------------------------------------------------------------------------------------------------------
-- 13 2019-11-20 22:51:58.508 DEBUG 11812 --- [ main] .g.w.m.m.P.selectRowBoundsByDynamicQuery : ==>
SELECT list_price AS list_price
FROM products
WHERE (id > 10) ORDER BY list_price DESC
LIMIT 1;
选择最小值,就是调用 min 函数
@Test
public void testSelectMin() {
// 直接用min 函数获取价格最小值
DynamicQuery<ProductsDO> selectMinQuery = DynamicQuery.createQuery(ProductsDO.class)
.and(ProductsDO::getId, greaterThan(10));
Optional<BigDecimal> minPriceOptional =
productMapper.selectMinByDynamicQuery(ProductsDO::getListPrice, selectMinQuery);
Assert.assertTrue(minPriceOptional.isPresent());
BigDecimal actualMinPrice = minPriceOptional.get();
// 间接正序获取价格最小值
DynamicQuery<ProductsDO> selectFirstQuery = DynamicQuery.createQuery(ProductsDO.class)
.select(ProductsDO::getListPrice)
.and(ProductsDO::getId, greaterThan(10))
.orderBy(ProductsDO::getListPrice, asc());
Optional<ProductsDO> productsDOOptional = productMapper.selectFirstByDynamicQuery(selectFirstQuery);
Assert.assertTrue(productsDOOptional.isPresent());
BigDecimal expectedMinPrice = productsDOOptional.get().getListPrice();
Assert.assertEquals(expectedMinPrice, actualMinPrice);
}
我们也可以看一下日志输出
-- 26 2019-11-20 23:25:32.043 DEBUG 14740 --- [ main] c.g.w.m.m.P.selectMinByDynamicQuery : ==> SELECT MIN(list_price) FROM products WHERE (id > 10); ------------------------------------------------------------------------------------------------------------------------ -- 27 2019-11-20 23:25:32.749 DEBUG 14740 --- [ main] .g.w.m.m.P.selectRowBoundsByDynamicQuery : ==> SELECT list_price AS list_price FROM products WHERE (id > 10) ORDER BY list_price ASC LIMIT 1;
忙了 3 个月了,终于有空更新一下… 后面已经在构思动态查询查 elasticsearch。