当前位置: 首页 > news >正文

基于lambda的mongodb查询插件

需求背景

需要一个像mybatis plus 一样的基于lambda, 且面向对象的查询mongo数据的插件。在网上找了很久,没有发现有类似功能的插件。于是自己手写了一个,借助mongoTemplate屏蔽了底层查询语句的实现细节。在此基础上,实现了查询的统一封装。

技术难点

  1. 基于SerializedLambda对象获取查询的属性,例如下面是获取task的name;

MongoLambdaQuery.lambdaQuery(Task.class).is(Task::getName, taskCriteria.getName())
  1. 怎么传参这种Task::getName 函数引用

通过函数式接口SFunction来表示R实际类型:

Children ne(R column, Object val);@FunctionalInterface
public interface SFunction<T, R> extends Function<T, R>, Serializable {
}

然后通过maybeDo来判断搜索参数不为空才进行查询。这里DoSomething又是一个函数式接口,something.doIt()时才会执行具体columnToString操作,得到我们的属性。

  protected Children addCondition(boolean condition, R column, SqlKeyword keyWord, Object val, Object... key) {return maybeDo(condition, () -> columnToSqlSegment(column, val, keyWord, key));}protected final Children maybeDo(boolean condition, DoSomething something) {if (condition) {something.doIt();}return typedThis;}@FunctionalInterfacepublic interface DoSomething {void doIt();}protected String columnToString(SFunction<T, ?> column) {return LambdaUtils.getField(column);}

c. 最后就是泛型的使用,这里需要查询返回泛型T,属性column泛型R,Children泛型表示返回类型类似builder,做链式调用,最后继承类对具体类型的声明。

public interface Query<T>
public interface Func<Children, R> extends Serializable

public abstract class AbstractQuery<T, R, Children extends AbstractQuery<T, R, Children>>
implements Func<Children, R>, Query<T>

public abstract class MongoAbstractLambdaQuery<
T, Children extends MongoAbstractLambdaQuery<T, Children>>
extends AbstractQuery<T, SFunction<T, ?>, Children>

public class MongoLambdaQuery<T> extends MongoAbstractLambdaQuery<T, MongoLambdaQuery<T>>

项目地址:

https://github.com/DarMi7/mongo-lambda-query

使用demo

  1. 引入maven依赖文件

<dependency>
<groupId>io.github.darmi7</groupId>
<artifactId>mongo-lambda-query</artifactId>
<version>1.1.0</version>
</dependency>
  1. 开启插件注解,加上需要扫描mongo实体的包路径

@EnableMongoLambdaQuery
@EnableMongoRepositories(basePackages = "com.darmi.demo.repository.mongo")
public class Application
  1. 编写查询代码

@Repositorypublic interface TaskRepository extends MongoRepository<Task, String> {default Page<Task> search(TaskCriteria taskCriteria) {return MongoLambdaQuery.lambdaQuery(Task.class).is(Task::getName, taskCriteria.getName()).is(Task::getType, taskCriteria.getFuzzyName()).reg(Task::getName, taskCriteria.getName()).gt(Task::getPoints, taskCriteria.getPoints()).gt(Task::getCreated, taskCriteria.getBegin()).lt(Task::getCreated, taskCriteria.getEnd()).page(taskCriteria.getPagination());}}
http://www.lryc.cn/news/11394.html

相关文章:

  • 基于微信小程序的微信社团小程序
  • GEE学习笔记 七十三:【GEE之Python版教程七】静态展示影像和动态展示影像
  • PGLBox全面解决图训练速度、成本、稳定性、复杂算法四大问题!
  • 超详细的 pytest 教程(一)使用入门篇
  • 二叉树理论基础知识点
  • 【算法基础】堆⭐⭐⭐
  • 时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测
  • 【TypeScrip】TypeScrip的任意类型(Any 类型 和 unknown 顶级类型):
  • 智能洗地机什么牌子好?智能洗地机排行
  • 【数据结构与算法】链表1:移除链表 设计链表链表反转(双指针法、递归法)
  • 山东大学软件学院面向对象简答题整理【个人向】
  • JAVA时间类及JAVA8新时间类
  • ASEMI代理FGH60N60SFD,安森美FGH60N60SFD原装IGBT
  • 【云原生之Docker实战】使用dokcer部署web端vscode
  • Docker安装Tomcat、mysql、redis
  • 【python 基础篇 八】python的常用数据类型操作-------集合
  • Spring框架中问题补充
  • 【Leedcode】顺序表必备的三道面试题(附图解)
  • SOFA Weekly|开源人、本周贡献 issue 精选
  • 2023美赛 ICM E题详细版思路
  • 【LeetCode】剑指 Offer(3)
  • springboot simple (13) springboot Elasticsearch(Elasticsearch8.5.1)
  • 《爆肝整理》保姆级系列教程python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
  • 分享111个HTML旅游交通模板,总有一款适合您
  • guava中ImmutableList使用示例详解
  • ASE28N50-ASEMI高压N沟道MOS管ASE28N50
  • MyBatis缓存
  • Linux环境下(CentOS 7)安装Java(JDK8)
  • 基于STM32L431+Liteos的串口空闲中断加DMA循环接收
  • BZOJ4403 序列统计