文章目录
  1. 1. 更新内容
    1. 1.1. toWhereExpression 方法

项目地址: mybatis-dynamic-query

更新内容

  1. 添加 toWhereExpression 方法,用于将 WhereExpression 转换为 SQL 字符串和参数。

toWhereExpression 方法

我们有一些场景需要把筛选单独拎出来, 比如on 的时候, 我们需要把筛选条件拎出来, 单独放到on 后面。
这样可以提高查询效率, 避免在主查询中筛选数据。

我们之前版本支持了@View 的站位,现在我们仍然需要用到这个重要特性达成我们的功能,比如我们声明一个@View 视图, ON_CONDITION_EXPRESSION 就是我们后续放筛选条件的占位符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@View("Categories JOIN Products ON Categories.CategoryID = Products.CategoryID ${ON_CONDITION_EXPRESSION}")
public class CategoryProductViewDO {

@Column(name = "CategoryName", table = "Categories")
private String categoryName;

@Column(name = "ProductID", table = "Products")
private Integer productId;

@Column(name = "ProductName", table = "Products")
private String productName;

@Column(name = "SupplierID", table = "Products")
private Integer supplierId;

@Column(name = "CategoryID", table = "Products")
private Integer categoryId;

@Column(name = "QuantityPerUnit", table = "Products")
private String quantityPerUnit;

@Column(name = "UnitPrice", table = "Products")
private BigDecimal unitPrice;

@Column(name = "UnitsInStock", table = "Products")
private Integer unitsInStock;

@Column(name = "UnitsOnOrder", table = "Products")
private Integer unitsOnOrder;

@Column(name = "ReorderLevel", table = "Products")
private Integer reorderLevel;

@Column(name = "Discontinued", table = "Products")
private String discontinued;

声明一个筛选条件,用来存放我们的筛选条件,然后放入 ON_CONDITION_EXPRESSION 占位符中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 根据分类名称查询产品
*/
public List<CategoryProductViewDO> findByCategoryName(String categoryName) {
DynamicQuery<CategoryProductViewDO> onQuery = DynamicQuery.createQuery(CategoryProductViewDO.class)
.and(CategoryProductViewDO::getProductName, o -> o.startWith("a"));
ParamExpression onFilterExpression = onQuery.toWhereExpression();
// 构建ON_CONDITION_EXPRESSION, 这里最好需要加上判断,当whereExpression为空时,不构建ON_CONDITION_EXPRESSION
// 以免残留 and 语法报错,就是说只有筛选才会有 and/or
String onConditionExpression = "";
if (StringUtils.isNotBlank(onFilterExpression.getExpression())) {
onConditionExpression = String.format("and %s", onFilterExpression.getExpression());
}
// 这个是主查询的构建
DynamicQuery<CategoryProductViewDO> mainQuery = DynamicQuery.createQuery(CategoryProductViewDO.class)
.and(CategoryProductViewDO::getCategoryName, o -> o.contains(categoryName))
// 传递ON_CONDITION_EXPRESSION参数
.queryParam("ON_CONDITION_EXPRESSION", onConditionExpression)
// 传递ON_CONDITION_EXPRESSION参数的其他参数 (在3.2.36 版本中,简化传参)
.queryParam(onFilterExpression.getParamMap());
// 在 3.2.35 版本。
// for (Map.Entry<String, Object> entry : onFilterExpression.getParamMap().entrySet()) {
// String key = entry.getKey();
// Object value = entry.getValue();
// query.queryParam(key, value);
// }
return categoryProductViewMapper.selectByDynamicQuery(query);
}

我们看一下输出结果, 大家可以看到 ON Categories.CategoryID = Products.CategoryID and (Products.ProductName LIKE ?) , 就是第一个筛选条件替换了我们的占位符。

1
2
3
2025-11-19 22:58:14 - ==>  Preparing: SELECT Products.UnitPrice AS unit_price, Products.UnitsInStock AS units_in_stock, Products.ReorderLevel AS reorder_level, Products.SupplierID AS supplier_id, Products.ProductID AS product_id, Products.QuantityPerUnit AS quantity_per_unit, Products.Discontinued AS discontinued, Categories.CategoryName AS category_name, Products.ProductName AS product_name, Products.CategoryID AS category_id, Products.UnitsOnOrder AS units_on_order FROM Categories JOIN Products ON Categories.CategoryID = Products.CategoryID and (Products.ProductName LIKE ?) WHERE (Categories.CategoryName LIKE ?) 
2025-11-19 22:58:14 - ==> Parameters: a%(String), %a%(String)
2025-11-19 22:58:14 - <== Total: 1

例子: mybatis-dynamic-query-sqlite-demo

文章目录
  1. 1. 更新内容
    1. 1.1. toWhereExpression 方法