Bean Searcher v4.3.0 重大更新!
往期阅读:
Bean Searcher 是什么?
Bean Searcher 是一款专注高级查询的只读 ORM 开源项目,其官网如下:

- 地址:https://bs.zhxu.cn/
- 安装使用方法:
// 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)始终生成条件1AlwaysFalse(恒真: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、升级 BeanMeta、SearchSql 与 参数构建器,优化或增加了一些 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 吧
- Gitee: https://gitee.com/troyzhxu/bean-searcher
- Github: https://github.com/troyzhxu/bean-searcher
- 官网:https://bs.zhxu.cn/
如果觉得文本不错,动手点个赞吧 _
往期阅读:
Bean Searcher v4.3.0 重大更新!的更多相关文章
- Fiddler录制jmeter脚本--V4.4..0.1版本
圣诞节到了,圣诞老人送平安,我们送技术,我们知道以前jmeter的脚本来源有三个,手动书写.badboy录制.自带的录制功能(jmeter3.0该功能还比较好),目前我们又多了一个fiddler生 ...
- FineUIPro/Mvc/Core/JS v4.2.0 发布了(老牌ASP.NET控件库,WebForms,ASP.NET MVC,Core,JavaScript)!
还记得 10 年前那个稍微青涩的 ExtAspNet 吗,如今她已脱胎换骨,变成了如下 4 款产品: FineUIPro:基于jQuery的经典款ASP.NET WebForms控件,之前的FineU ...
- 地图SDK全新版本v4.3.0上线 - 新增多项功能及优化
以下内容转载自腾讯位置服务公众号的文章<地图SDK全新版本v4.3.0上线 - 新增多项功能及优化!> 作者:腾讯位置服务 链接:https://mp.weixin.qq.com/s/hb ...
- plain framework 1 1.0.4 更新 稳定版发布
PF由于各种因素迟迟不能更新,此次更新主要是更新了以往和上个版本出现的内存问题,该版本较为稳定,如果有用到的朋友请更新至此版本. PF 1.0.4 修复1.0.0.3更新后产生的内存问题,可能导致网络 ...
- docker管理shipyard中文版v3.0.2更新
shipyard中文版v3.0.2更新 https://console.dockerclub.net/ https://dockerclub.net/docs/intro/getting_start ...
- 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 ...
- OpenLayers v4.2.0 -----地图延迟加载;
官方:http://openlayers.org/en/latest/examples/lazy-source.html <!DOCTYPE html> <html> < ...
- IntelliJ Idea 常用快捷键总结-0 #<间断性更新中...>,部分有示例
IntelliJ Idea 常用快捷键总结-0 <间断性更新中...>,部分有示例 自动补齐代码 常用的有for循环体,fori可以输出循环语句: eg: public void test ...
- Selenium 4.0 Alpha更新实践
上期讲到了Selenium 4.0 Alpha更新日志,这次来实践一下更新内容. DevTools操作更加方便. Chrome录制更加方便.(未实践) 窗口管理不在依赖一个driver. 相对定位器功 ...
- ADFS 4.0 证书更新
ADFS 4.0 证书更新 由于公网证书的过期,需要重新更新ADFS的服务通信证书: 证书要求: 带私钥 PFX格式 更换流程: 证书安装到 证书\计算机\个人,安装后点开证书能看到"你有一 ...
随机推荐
- 利器解读!Linux 内核调测中最最让开发者头疼的 bug 有解了|龙蜥技术
简介:通过在Anolis 5.10 内核中增强 kfence 的功能,实现了一个线上的.精准的.可定制的内存调试解决方案. 编者按:一直持续存在内核内存调测领域两大行业难题: "内存被改& ...
- IIncrementalGenerator 增量 Source Generator 生成代码入门 读取 csproj 项目文件的属性配置
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,读取项目里的项目文件属性,从而实现为项目定制的逻辑.或者是读取 NuGet ...
- K8s控制器---Replicaset(7)
一.Replicaset(目前少用了) 1.1 控制器管理pod 什么是控制器?前面我们学习了 Pod,那我们在定义 pod 资源时,可以直接创建一个 kind:Pod 类型的自主式 pod,但是这存 ...
- React项目中报错:Parsing error: The keyword 'import' is reservedeslint
记得更改完配置后,要重启编辑器(如:VSCode)!!! 记得更改完配置后,要重启编辑器(如:VSCode)!!! 记得更改完配置后,要重启编辑器(如:VSCode)!!! 这个错误通常发生在你尝试在 ...
- Docker 之 Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 一.官方镜像 学习docker镜像的制作之前,先去看看官方的镜像是怎么制作的,查看官方dockerf ...
- SpringMVC学习四(文件上传/拦截器)
1.文件上传 1.1预备工作,需要两个jar包(Fileupload) jar包下载路径: [点击下载https://github.com/suyirulan/putao/tree/master/fi ...
- SQL函数详解SUM\COUNT\AVG......
朋友们,个人公众号:SQL数据库运维 移动端的学习分享,各种数据库基础知识,一起进步,共同学习,期待你的加入. 函数的类型 1.聚合函数:对一组值执行计算,并返回单个值,也被称为组函数.聚合函数经常与 ...
- postgresql性能优化3:分区表
一.分区表产生的背景 随着使用时间的增加,数据库中的数据量也不断增加,因此数据库查询越来越慢. 加速数据库的方法很多,如添加特定的索引,将日志目录换到单独的磁盘分区,调整数据库引擎的参数等.这些方法都 ...
- 同时添加多个的远程桌面工具,Windows远程桌面设置多用户同时登录
Windows Server 版本上的 Windows 远程桌面服务 (RDS) 允许多个用户同时登录. 但是,在标准的Windows桌面版本(例如Windows 10)上,默认情况下,远程桌面是为单 ...
- 继承与ER图
会员是用户吗? 实体与集合 er图叫实体联系图.什么是实体?是现实中存在的事物个体,用户背后是实际存在的单个人. 对象->实体 类->实体的集合 er图描述的是实体间的联系 会员是真实存在 ...