Skip to content

字段参数

字段参数是根据 检索实体类里具有数据库字段映射的 属性 衍生出来的一系列参数,它们起到对查询结果进行 筛选 的作用。

字段衍生参数

衍生规则

示例,对于如下的一个实体类:

java
public class User {
    private String name;
    // 省略其它..
}

以它的 name 字段为例,可衍生出以下一系列的字段参数:

  • name-{n}: name 字段的第 n 个参数值,如:name-0name-1name-2 等等(理解不了?参考这里
  • name: 等价于 name-0,name 字段的第 0 个参数值
  • name-op: name 的 字段运算符,如: EqualGreaterEqualGreaterThan 等等
  • name-ic: name 字段在检索时是否应该忽略大小写

以上在衍生字段参数时,用到了中划线(-)作为连接符,如果你喜欢下划线(_),可把 bean-searcher.params.separator 配置为下划线即可。配置为下划线后,衍生出的参数就是 name_{n}namename_opname_ic 了。同理: opic 后缀您也可以自定义。

TIP

字段参数,是根据实体类里的 JAVA 字段名(不是表字段)衍生出来的,已经和数据库的表字段解耦了。

可配置项

在 SpringBoot / Grails 项目中,若使用了 bean-searcher-boot-starter 依赖,可在项目的 application.propertiesapplication.yml 文件中通过如下配置项对字段参数进行定制:

配置键名含义可选值默认值
bean-searcher.params.separator字段参数名分隔符字符串-
bean-searcher.params.operator-key字段运算符参数名后缀字符串op
bean-searcher.params.ignore-case-key是否忽略大小写字段参数名后缀字符串ic

扩展衍生参数

另外,如果你觉得默认的字段衍生参数不太好用,那么还可以使用 参数过滤器 来自定义新的规则。实际上自 v4.3.0 起,Bean Searcher 就自带了一些简化衍生参数的过滤器:

字段运算符

字段运算符是用来描述某个字段的检索方式,即:SQL 的拼接方法。Bean Searcher 共默认提供了 22 种不同的字段运算符,见下表:

下表中的 忽略空值 的含义是:如果该字段的参数值为 null空串,是否忽略该条件。

运算符缩写SQL 片段是否忽略空值含义
Equaleqx = ?等于(是缺省默认的运算符)
NotEqualnex != ?不等于
GreaterThangtx > ?大于
GreaterEqualgex >= ?大于等于
LessThanltx < ?小于
LessEquallex <= ?小于等于
Betweenbtx between ?1 and ?2 / x >= ?1 / x <= ?2在...之间(范围查询)
NotBetweennbx not between ?1 and ?2 / x < ?1 / x > ?2不在...之间(范围查询)(since v3.3
Containctx like '%?%'包含(模糊查询)(since v3.2
StartWithswx like '?%'以...开头(模糊查询)
EndWithewx like '%?'以...结尾(模糊查询)
OrLikeolx like ?1 or x like ?2 or ...模糊或匹配(可有多个参数值)(since v3.7
NotLikenkx not like ?反模糊匹配(since v3.8
InListilx in (?, ?, ...)多值查询(自 v3.3 新增,之前是 MultiValue / mv
NotInnix not in (?, ?, ...)多值查询(since v3.3
IsNullnlx is null为空(since v3.3
NotNullnnx is not null不为空(since v3.3
Emptyeyx is null or x = ''为空(仅适用于 字符串 类型的字段)
NotEmptynyx is not null and x != ''不为空(仅适用于 字符串 类型的字段)
AlwaysTrueat1恒真(since v4.3
AlwaysFalseaf0恒假(since v4.3
SqlCondsql自定义 SQL 条件只能在参数构建器中使用,参考 自定义 SQL 条件 章节(since v3.8.0

除此之外

你还可以自定义运算符,参见 高级 > 玩转运算符 章节。

由于 Bean Searcher 为运算符提供了全称与缩写,所以对于每一种运算符,都有几种等效的用法,

例如,查询 name 等于 Jack 的用户:

  • 后端参数构建:
java
Map<String, Object> params = MapUtils.builder()
        .field("name", "Jack")          // (1) 字段 name 的值为 Jack
        .field(User::getName, "Jack")   // 等效写法 == (1) 
        .op("eq")                       // (2) 指定 name 字段的运算符为 eq (默认就是 eq, 所以也可以省略)
        .op("Equal")                    // 等效写法 == (2) 
        .op(FieldOps.Equal)             // 等效写法 == (2) 
        .op(Equal.class)                // 等效写法 == (2) 
        .build();
User jack = searcher.searchFirst(User.class, params);           // 执行查询
  • 前端传参形式:
js
GET /users ? name=Jack & name-op=eq        // (1) 字段 name 的值为 Jack,运算符为 eq
GET /users ? name=Jack & name-op=Equal     // 等效写法 == (1) 
GET /users ? name-0=Jack & name-op=eq      // 等效写法 == (1) 
GET /users ? name-0=Jack & name-op=Equal   // 等效写法 == (1) 
GET /users ? name=Jack          // (2) 当 name 无运算符约束,或运算符约束中第一个为 Equal 时,与 (1) 等效 
GET /users ? name-0=Jack        // 等效写法 == (2)

基于 Apache 许可发布