往期阅读:

Bean Searcher 是什么?

Bean Searcher 是一款专注高级查询的只读 ORM 开源项目,其官网如下:

// SpringBoot / Grails 项目直接使用该依赖
implementation 'cn.zhxu:bean-searcher-boot-starter:4.3.0'
// Solon 项目直接使用该依赖(功能同 bean-searcher-boot-starter)
implementation 'cn.zhxu:bean-searcher-solon-plugin:4.3.0'
// 非 SpringBoot / Grails / Solon 项目,直接使用核心依赖,
implementation 'cn.zhxu:bean-searcher:4.3.0'

本次更新内容

1、新增用于在后端嵌套构造复杂条件的 and(..)or(..) 方法:

例如,后端想查询满足 {[(name = 'Jack' 且 忽略大小写) 并且 (gender = 'Male')] 或者 [name = 'Alice' 并且 gender = 'Female']} 并且 (age >= 20) 条件的所有 User 数据,则可以:

  • v4.3.0 新增的 后端构造检索条件 的写法:
// 构造检索参数
var params = MapUtils.builder()
.or(o -> o
.and(a -> a
.field(User::getName, "Jack").ic()
.field(User::getGender, "Male")
)
.and(a -> a
.field(User::getName, "Alice")
.field(User::getGender, "Female")
)
)
.field(User::getAge, "20").op(GreateEqual.class)
.build();
// 执行查询
List<User> users = beanSearcher.searchAll(User.class, params);

使用 and(..)or(..) 方法后,无需在手动调用 groupExpr(..) 设置逻辑表达式,因为它会自动生成了。

  • v4.3.0 之前的 后端构造检索条件 的写法:
// 构造检索参数
var params = MapUtils.builder()
.group("A") // A 组开始
.field(User::getName, "Jack").ic()
.field(User::getGender, "Male")
.group("B") // B 组开始
.field(User::getName, "Alice")
.field(User::getGender, "Female")
.group("C") // C 组开始
.field(User::getAge, "20").op(GreateEqual.class)
.groupExpr("(A|B)&C") // 组间逻辑关系(组表达式)
.build();
// 执行查询
List<User> users = beanSearcher.searchAll(User.class, params);
  • 当然,同样的检索条件,后端可以只写一行代码,由前端传参控制:

前端只需传参:

A.name=Jack      // A 组条件
A.name-ic=true
A.gender=Male
B.name=Alice // B 组条件
B.gender=Female
C.age=20 // C 组条件
C.age-op=ge
gexpr=(A|B)&C // 组间的逻辑关系

然后,在后端一行代码实现查询:

@GetMapping("/users")
public SearchResult<User> users(HttpServletRequest request) {
// 接收前端参数,执行查询(无需担心非法参数,框架会自动过滤)
return beanSearcher.search(User.class, MapUtils.flat(request.getParameterMap()));
}

参考:https://bs.zhxu.cn/guide/param/group.html

2、前端传参的 关系表达式 与 后端参数构建器构建的逻辑关系支持合并:

例如,前端传参:

A.name=Jack      // A 组条件
B.name=Alice // B 组条件
gexpr=A|B // 组间的逻辑关系

然后,后端也构建了逻辑关系:

@GetMapping("/users")
public SearchResult<User> users(HttpServletRequest request) {
// 接收前端参数
var params = MapUtils.flatBuilder(request.getParameterMap())
// 附加一些条件
.or(o -> o
.field(User::getGender, "Female")
.field(User::getAge, "20").op(LessThan.class)
)
.build();
// 执行查询
return beanSearcher.search(User.class, params);
}

则实际生成的条件为:(name = 'Jack' 或者 name = 'Alice') 并且 (gender = 'Female' 或者 age < 20)

参考:https://bs.zhxu.cn/guide/param/group.html#表达式合并-since-v4-3-0

3、拼接参数,支持直接使用 集合参数值

例如在 SearchBean 中定义了一个 ages 拼接参数:

@SearchBean(where = "age in (:ages:)")
public class User {
// ...
}

然后在检索时,可以为其直接添加集合参数值:

var params = MapUtils.builder()
.put("ages", Arrays.asList(20,30,40)) // 直接使用 List 参数值,也可以使用 Set
.build();
List<User> users = searcher.searchList(User.class, params);

也可以使用数组作为参数值:

var params = MapUtils.builder()
.put("ages", new int[] {20,30,40}) // 可以使用原生数组
.put("ages", new Integer[] {20,30,40}) // 也可以使用对象数组
.build();
List<User> users = searcher.searchList(User.class, params);

v4.3.0 之前,只能使用字符串:

var params = MapUtils.builder()
.put("ages", "20,30,40") // v4.3.0 之前的用法,只能传字符串
.build();
List<User> users = searcher.searchList(User.class, params);

参考:https://bs.zhxu.cn/guide/param/embed.html#拼接参数

4、支持前端同名参数传多个值的用法

例如,前端这样请求用户查询接口:

  • 新支持的方式:GET /users ? age=20 & age=30 & age-op=bt

则其与下面的方式等效:

  • 原始传参方式:GET /users ? age-0=20 & age-1=30 & age-op=bt

bt 是什么?请参考:https://bs.zhxu.cn/guide/param/field.html

5、支持后缀运算符的简化传参形式

例如,前端原本的两个参数 age=20 & age-op=ge,现在可以简化成一个:age-ge=20

即使进行了逻辑分组,也可以被简化,例如:

A.age=30
A.age-op=gt

可以简化为

A.age-gt=30

参考:https://bs.zhxu.cn/guide/advance/filter.html#suffixopparamfilter

6、支持让前端以 JSON 数组的方式传递多个参数值

例如,原来的传参形式(age between 20 and 30):

age-0=20
age-1=30
age-op=bt

现在可以简化为:

age=[20,30]
age-op=bt

当然还可以进一步简化:

age-bt=[20,30]

参考:https://bs.zhxu.cn/guide/advance/filter.html#jsonarrayparamfilter

7、新增 AlwaysTrue(恒真:at)与 AlwaysFalse(恒假:af)运算符

  • AlwaysTrue(恒真:at)始终生成条件 1
  • AlwaysFalse(恒真:af)始终生成条件 0

例如,前端传参 name=Jack & age = 30 两个参数进行用户查询,后端接口里想忽略前端的 age 字段,则可以:

@GetMapping("/users")
public SearchResult<User> users(HttpServletRequest request) {
var params = MapUtils.flatBuilder(request.getParameterMap())
field(User::getAge).op(AlwaysTrue.class) // 使用 恒真 运算符
.build();
return beanSearcher.search(User.class, params);
}

则,最终生成的 SQL 条件为 ... where name = 'Jack' and 1,起到吧 age 参数忽略的目的。当然,我们还可以使用 条件约束,直接声明 age 字段不能参与 where 条件,来到达通用的效果:

public class User {
@DbField(conditional = false)
private int age;
// ...
}

只不过使用这种方式,age 字段就再也不能动态作为条件了。所以,这两种方式分别适用于不同的场景。

8、升级了 Oracle 方言的分页语法

升级了 OracleDialect, 采用了 offset ? rows fetch next ? rows only 分页语法,该语法在 Oracle 12c(2013年6月发布)及以上版本支持。

所以如果你使用的是 12c 以前的 Oracle 版本,在使用 Bean Searcher v4.3+ 时,则需要将老版本的 OracleDialect(点击查看方言代码) 拷贝到自己的项目中,作为自定义方言使用。

参考:https://bs.zhxu.cn/guide/advance/dialect.html

9、升级 BeanMetaSearchSql 与 参数构建器,优化或增加了一些 API

  • BeanMeta 新增了 getSqlSnippets() 方法,用户可以在 过滤器拦截器 中 使用该方法获取该实体类上所有已解析的 SQL 片段;
  • SearchSql 新增了 getSearchParam() 方法,用户可以在 拦截器 中使用该方法获取到解析后的检索参数;
  • 优化参数构建器的 field(FieldFn, Collection) 与 field(String, Collection) 方法,使其第二个参数兼容传入 null 的用法,例如下面的代码将不再报错:
// List 参数,但是值为 null,最终该参数条件会被忽略
List<Long> idList = null; var params = MapUtils.builder()
.field(User::getId, idList).op(InList.class)
.build();
List<User> users = beanSearcher.search(User.class, params);
  • 参数构建器新增 buildForRpc() 方法,用于在后端请求其它服务的 Bean Searcher 查询接口,例如:
// 组织检索参数
var params = MapUtils.builder()
.field(User::getAge, 20, 30).op(Between.class)
.page(0, 20)
.buildForRpc();
// 调用 A 服务中的接口
List<User> users = romoteApi.getUserList(params);

参考:https://bs.zhxu.cn/guide/usage/rpc.html

10、新增 5 个配置项

bean-searcher:
params:
group:
# 指定组表达式是否可合并,默认 true
mergeable: true
filter:
# 是否启用 SizeLimitParamFilter,默认 true
use-size-limit: true
# 是否启用 ArrayValueParamFilter,默认 true
use-array-value: true
# 是否启用 SuffixOpParamFilter,默认 false
use-suffix-op: true
# 是否启用 JsonArrayParamFilter,默认 false
use-json-array: true

参考:https://bs.zhxu.cn/guide/info/versions.html#v4-3-的新特性-v4-3-0

最后:点个 STAR 吧

如果觉得文本不错,动手点个赞吧 _

往期阅读:

Bean Searcher v4.3.0 重大更新!的更多相关文章

  1. Fiddler录制jmeter脚本--V4.4..0.1版本

      圣诞节到了,圣诞老人送平安,我们送技术,我们知道以前jmeter的脚本来源有三个,手动书写.badboy录制.自带的录制功能(jmeter3.0该功能还比较好),目前我们又多了一个fiddler生 ...

  2. FineUIPro/Mvc/Core/JS v4.2.0 发布了(老牌ASP.NET控件库,WebForms,ASP.NET MVC,Core,JavaScript)!

    还记得 10 年前那个稍微青涩的 ExtAspNet 吗,如今她已脱胎换骨,变成了如下 4 款产品: FineUIPro:基于jQuery的经典款ASP.NET WebForms控件,之前的FineU ...

  3. 地图SDK全新版本v4.3.0上线 - 新增多项功能及优化

    以下内容转载自腾讯位置服务公众号的文章<地图SDK全新版本v4.3.0上线 - 新增多项功能及优化!> 作者:腾讯位置服务 链接:https://mp.weixin.qq.com/s/hb ...

  4. plain framework 1 1.0.4 更新 稳定版发布

    PF由于各种因素迟迟不能更新,此次更新主要是更新了以往和上个版本出现的内存问题,该版本较为稳定,如果有用到的朋友请更新至此版本. PF 1.0.4 修复1.0.0.3更新后产生的内存问题,可能导致网络 ...

  5. docker管理shipyard中文版v3.0.2更新

    shipyard中文版v3.0.2更新  https://console.dockerclub.net/ https://dockerclub.net/docs/intro/getting_start ...

  6. struts2-core-2.0.14更新到2.3.15

    struts2-core-2.0.14更新到2.3.15 将低版本的struts2-core更新到最新版本2.3.15,更新jar包,有这个几个 1. struts2-core-2.0.14.jar ...

  7. OpenLayers v4.2.0 -----地图延迟加载;

    官方:http://openlayers.org/en/latest/examples/lazy-source.html <!DOCTYPE html> <html> < ...

  8. IntelliJ Idea 常用快捷键总结-0 #<间断性更新中...>,部分有示例

    IntelliJ Idea 常用快捷键总结-0 <间断性更新中...>,部分有示例 自动补齐代码 常用的有for循环体,fori可以输出循环语句: eg: public void test ...

  9. Selenium 4.0 Alpha更新实践

    上期讲到了Selenium 4.0 Alpha更新日志,这次来实践一下更新内容. DevTools操作更加方便. Chrome录制更加方便.(未实践) 窗口管理不在依赖一个driver. 相对定位器功 ...

  10. ADFS 4.0 证书更新

    ADFS 4.0 证书更新 由于公网证书的过期,需要重新更新ADFS的服务通信证书: 证书要求: 带私钥 PFX格式 更换流程: 证书安装到 证书\计算机\个人,安装后点开证书能看到"你有一 ...

随机推荐

  1. Hexo博客框架—轻量、一令部署

    ​简介:Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页.Hexo支持Github Flavored M ...

  2. ESP32 多线程入门实验

    一.线程创建函数 函数 void xTaskCreate ( pdTASK_CODE pvTaskCode, const portCHAR * const pcNane, unsigned portS ...

  3. Intel Pentium III CPU(Coppermine, Tualatin) L2 Cache Latency, Hardware Prefetch特性调查

    这几天,偶然的机会想到了困扰自己和其他网友多年的Intel Pentium III系列处理器缓存延迟(L2 Cache Latency),以及图拉丁核心版本是否支持硬件预取(Hardware Pref ...

  4. 使用AI在原神里自动钓鱼,扫描Git仓库泄露的密码 【蛮三刀酱的Github周刊第三期】

    大家好,这里是的Github精彩项目分享周刊,我是每周都在搬砖的蛮三刀酱. 我会从Github热门趋势榜里选出 高质量.有趣,牛B 的开源项目进行分享. 榜单取自实时Github Trending排行 ...

  5. Photoshop AI 令人惊叹的生成式填充

    原文地址:Adobe Photoshop's Amazing New Generative Fill | by Paul DelSignore | The Generat | May, 2023 | ...

  6. go-zero modd开发配置

    目录 go-zero modd开发配置 modd配置 项目打包编排文件 nginx配置文件 各服务中的配置里要写上如下配置 go-zero modd开发配置 modd配置 modd.conf #use ...

  7. ansible系列(35)--ansible实战之部署WEB集群架构(5)

    目录 1. 整体测试 1.1 运行playbook 1.2 出口路由器防火墙规则设置 1.3 访问测试 1. 整体测试 1.1 运行playbook playbook的整体运行过程如下(因为之前都运行 ...

  8. uniapp去除button的边框

    button { border: none !important; } button::after { border: none !important; }

  9. ༺$Musique$༻

    往期链接在文末 最近好喜欢听一些有年代感的歌啊. ~~头图~~ <$ On\ \And \ On $> Hold me close til I get up Time is barely ...

  10. C数据结构:哈夫曼树算法实现与应用

    学习哈夫曼树(编码) 带权二叉树 认识WPL 最优二叉树 构造哈夫曼树的过程 哈夫曼树的应用 建立哈夫曼树 代码如下: 结构体代码部分 建立操作代码 找到最小结点(※难点) 附上建立哈夫曼树源代码 带 ...