Bean Searcher v4.3.0 重大更新!

news/2024/9/30 7:30:42

往期阅读:

  • 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍
  • 最近火起的 Bean Searcher 与 MyBatis Plus 倒底有啥区别?
  • Bean Searcher v3.8.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)始终生成条件 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:# 指定组表达式是否可合并,默认 truemergeable: truefilter:# 是否启用 SizeLimitParamFilter,默认 trueuse-size-limit: true# 是否启用 ArrayValueParamFilter,默认 trueuse-array-value: true# 是否启用 SuffixOpParamFilter,默认 falseuse-suffix-op: true# 是否启用 JsonArrayParamFilter,默认 falseuse-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/

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

往期阅读:

  • 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍
  • 最近火起的 Bean Searcher 与 MyBatis Plus 倒底有啥区别?
  • Bean Searcher v3.8.0 一大波新特性来袭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/45263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

探索2024年的软件开发

2024年6月了,目前的软件开发已经到了什么阶段了? 哪个阶段是开发的重难点?CI/CD吗?容器化/容器编排?GPU、TPU调度?提前小结: 1、CI/CD 是 现代化软件开发的核心。 公司有,独立开发者也应该有一套,可以大大提高开发效率。 2、代码生成LLM大模型 需要积极探索。 作者只用…

vscode process terminal 3221225506 终端打不开 默认打开powershell

可能旧的 版本,旧的文章不适用 可能内网环境,识别不了终端 现在的解决方式是,打开setting,搜索“”“powershell” ,定位到 ,修改default profile 选项为 Command Prompt附 网上的旧方法不适用 ,如 2021年的文章 https://blog.csdn.net/qq_40021015/article/details/113…

使用‘消除’技术绕过LLM的安全机制,不用训练就可以创建自己的nsfw模型

开源的大模型在理解和遵循指令方面都表现十分出色。但是这些模型都有审查的机制,在获得被认为是有害的输入的时候会拒绝执行指令,例如会返回“As an AI assistant, I cannot help you.”。这个安全功能对于防止误用至关重要,但它限制了模型的灵活性和响应能力。 在本文中,我…

转换协议字节

转换协议字节/// <summary>/// 转换协议字节帮助类/// </summary>public class ByteUtil{/// <summary>/// byte数组转换int/// </summary>/// <param name="src"></param>/// <param name="offset"></param…

硬件开发笔记(十八):核心板与底板之间的连接方式介绍说明:板对板连接器

前言核心板与底板之间的连接方式至少就有四种以上,包括且不限于:DIP直插、板对板连接器、邮票孔和金手指。 常用连方式介绍DIP直插DIP就是以前的元器件封装,直接DIP插入焊接,宿便找了个,如下图:  可以定制自己的,一般来说,没有高速电路问题不大,但是这种方式对于复杂…

大模型应用之路:从提示词到通用人工智能(AGI)

大模型在人工智能领域的应用正迅速扩展,从最初的提示词(Prompt)工程到追求通用人工智能(AGI)的宏伟目标,这一旅程充满了挑战与创新。本文将探索大模型在实际应用中的进展,以及它们如何为实现AGI铺平道路。 基于AI大模型的推理功能,结合了RAG(检索增强生成)、智能体(…

进程还在,JSF接口不干活了,这你敢信?

1、问题背景: 应用在配合R2m升级redis版本的过程中,上游反馈调用接口报错,RpcException:[Biz thread pool of provider has been exhausted],通过监控系统和日志系统定位到现象只出现在一两个节点,并持续出现。第一时间通过JSF将有问题的节点下线,保留现场,业务恢复。 …

第四届计算机技术与信息科学国际研讨会(ISCTIS 2024)

【连续3年稳定EI,IEEE独立出版丨高校主办】第四届计算机技术与信息科学国际研讨会(ISCTIS 2024)将于2024年7月12-14日在中国西安举行。【连续3年稳定EI,IEEE独立出版丨十余所高校联合支持】第四届计算机技术与信息科学国际研讨会(ISCTIS 2024) 2024 4th International Symp…