本类型泛型
+ * @param 参数泛型
+ * @author wangyu
+ */
+public interface QueryChain, P> extends QueryDefinition {
+
+ /**
+ * 以且连接下一个字段
+ *
+ * @param column 列
+ * @return 查询条件
+ */
+ QueryCondition and(P column);
+
+ /**
+ * 直接拼接提供者,此处懒加载,最终build才会执行
+ *
+ * @param supplier 提供者
+ * @param 泛型,支持其他类型的链
+ * @return 结果
+ */
+ > C and(Supplier> supplier);
+
+ /**
+ * 条件列表
+ *
+ * @param chain 多个条件们
+ * @return 结果
+ */
+ > C and(QueryChain chain);
+
+ /**
+ * 多个嵌套子条件列表
+ *
+ * @param chains 多条链
+ * @return 结果
+ */
+ default > C and(List> chains) {
+ return and(chains, Combinator.AND);
+ }
+
+ /**
+ * 多个嵌套子条件列表
+ *
+ * @param chains 多条链
+ * @param combinator 各个链条之间的连接方式
+ * @return 结果
+ */
+ > C and(List> chains, Combinator combinator);
+
+ /**
+ * 以或连接下一个字段
+ *
+ * @param column 列
+ * @return 查询条件
+ */
+ QueryCondition or(P column);
+
+ /**
+ * 以或连接条件列表
+ *
+ * @param chain 多个条件们
+ * @return 结果
+ */
+ > C or(QueryChain chain);
+
+ /**
+ * 以或连接嵌套多个子条件列表
+ *
+ * @param chains 多条链
+ * @return 结果
+ */
+ default > C or(List> chains) {
+ return and(chains, Combinator.AND);
+ }
+
+ /**
+ * 以或连接嵌套多个子条件列表
+ *
+ * @param chains 多条链
+ * @param combinator 各个链条之间的连接方式
+ * @return 结果
+ */
+ > C or(List> chains, Combinator combinator);
+
+ /**
+ * 直接拼接提供者,此处懒加载,最终build才会执行
+ *
+ * @param supplier 提供者
+ * @param 泛型,支持其他类型的链
+ * @return 结果
+ */
+ > C or(Supplier> supplier);
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryCondition.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryCondition.java
new file mode 100644
index 0000000..9cb3c27
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryCondition.java
@@ -0,0 +1,152 @@
+package com.flyfish.framework.query;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 查询条件
+ *
+ * @param 条件本类型
+ * @author wangyu
+ */
+public interface QueryCondition> {
+
+ /**
+ * 相等判定
+ *
+ * @param value 值
+ * @return 结果
+ */
+ C eq(Object value);
+
+ /**
+ * 判定某列的值中存在指定值,特指json array数据类型且子类型中带有id的场景
+ * 用于兼容mongodb查询,mysql查询使用JSON_CONTAINS进行判定。
+ * 当且仅当mongodb会拼接.$id,mysql一律匹配id字段
+ *
+ * 等价于 .eq(value)
+ *
+ * @param value 值
+ * @return 结果
+ */
+ C hasId(Object value);
+
+ /**
+ * 对于mongodb,自动处理。对于关系型数据库,代表json array中是否包含对应值,值仅支持基本数据类型
+ *
+ * 等价于 .eq(value)
+ *
+ * @param value 基本数据类型的值
+ * @return 结果
+ */
+ C has(Object value);
+
+ /**
+ * 不等判定
+ *
+ * @param value 值
+ * @return 结果
+ */
+ C ne(Object value);
+
+ /**
+ * 值介于两者之间
+ *
+ * @param items 双值列表
+ * @return 结果
+ */
+ C between(List> items);
+
+ /**
+ * 模糊匹配,这里是全模糊
+ *
+ * @param keyword 查询关键字
+ * @return 结果
+ */
+ C like(String keyword);
+
+ /**
+ * 根据指定的方向进行模糊查询
+ *
+ * @param keyword 关键字
+ * @param direction 方向,可以匹配开头和结尾
+ * @return 结果
+ */
+ C like(String keyword, Queries.Direction direction);
+
+ /**
+ * 判定为空
+ *
+ * @return 结果
+ */
+ C isNull();
+
+ /**
+ * 包含在内
+ *
+ * @param values 集合
+ * @return 结果
+ */
+ C in(Collection> values);
+
+ /**
+ * 包含在内
+ * 注意,需要根据字段类型推断。
+ * 如果是json数组,需要进行双向匹配
+ *
+ * @param values 值们
+ * @return 结果
+ */
+ C in(Object... values);
+
+ /**
+ * 不包含在内
+ * 注意,需要根据字段类型推断。
+ * 如果是json数组,需要进行双向匹配
+ *
+ * @param values 值们
+ * @return 结果
+ */
+ C nin(Object... values);
+
+ /**
+ * 不包含在内
+ *
+ * @param values 集合
+ * @return 结果
+ */
+ C nin(Collection> values);
+
+ /**
+ * 小于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ C lt(Object value);
+
+ /**
+ * 小于等于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ C lte(Object value);
+
+ /**
+ * 大于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ C gt(Object value);
+
+ /**
+ * 大于等于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ C gte(Object value);
+
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryDefinition.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryDefinition.java
new file mode 100644
index 0000000..fb016e5
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryDefinition.java
@@ -0,0 +1,42 @@
+package com.flyfish.framework.query;
+
+import com.flyfish.framework.query.holder.QueryChainHolder;
+import com.flyfish.framework.query.spi.adaptor.CriteriaAdaptor;
+
+/**
+ * 可构建的
+ *
+ * @author wangyu
+ */
+public interface QueryDefinition {
+
+ /**
+ * 构建结果
+ *
+ * @param adaptor 查询适配器
+ * @param 泛型
+ * @return 构建结果
+ */
+ T build(CriteriaAdaptor adaptor);
+
+ /**
+ * 修改,此修改会直接接着查询条件进行拼接
+ *
+ * @return 修改句柄
+ */
+ QueryMutation mutate();
+
+ /**
+ * 会直接添加嵌套查询到当前查询末尾
+ *
+ * @return 修改句柄
+ */
+ QueryMutation within();
+
+ /**
+ * 判断查询条件是否为空
+ *
+ * @return 结果
+ */
+ boolean isEmpty();
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryFactories.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryFactories.java
new file mode 100644
index 0000000..595d7e0
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryFactories.java
@@ -0,0 +1,33 @@
+package com.flyfish.framework.query;
+
+import com.flyfish.framework.domain.base.Domain;
+import com.flyfish.framework.query.spi.QueryFactory;
+import org.springframework.core.io.support.SpringFactoriesLoader;
+import org.springframework.data.repository.core.EntityInformation;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 查询工厂持有者
+ *
+ * @author wangyu
+ */
+class QueryFactories {
+
+ @SuppressWarnings("rawtypes")
+ private static final List FACTORIES =
+ SpringFactoriesLoader.loadFactories(QueryFactory.class, null);
+
+ /**
+ * 获取目标查询工厂
+ *
+ * @param entityInformation 实体信息
+ * @return 结果
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public static Optional getFactory(EntityInformation extends Domain, String> entityInformation) {
+ return FACTORIES.stream().filter(factory -> factory.supports(entityInformation))
+ .findFirst();
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryMutation.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryMutation.java
new file mode 100644
index 0000000..2bd65eb
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/QueryMutation.java
@@ -0,0 +1,80 @@
+package com.flyfish.framework.query;
+
+import com.flyfish.framework.domain.base.Domain;
+import com.flyfish.framework.query.support.DomainFunction;
+
+/**
+ * 查询修改逻辑
+ *
+ * @author wangyu
+ */
+public interface QueryMutation {
+
+ /**
+ * 以lambda的形式修改
+ * 注意,如果之前用过lambda的形式,此处应该校验类型
+ *
+ * @param getter 方法引用
+ * @param 实体泛型
+ * @return 结果
+ */
+ QueryCondition> and(DomainFunction getter);
+
+ /**
+ * 以column的形式修改
+ *
+ * @param column 列名
+ * @return 结果
+ */
+ QueryCondition and(String column);
+
+ /**
+ * 直接以and拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ LambdaQueryChain and(LambdaQueryChain chain);
+
+ /**
+ * 直接以and拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ NamedQueryChain and(NamedQueryChain chain);
+
+ /**
+ * 以lambda的形式修改
+ * 注意,如果之前用过lambda的形式,此处应该校验类型
+ *
+ * @param getter 方法引用
+ * @param 实体泛型
+ * @return 结果
+ */
+ QueryCondition> or(DomainFunction getter);
+
+ /**
+ * 以column的形式修改
+ *
+ * @param column 列名
+ * @return 结果
+ */
+ QueryCondition or(String column);
+
+ /**
+ * 直接以or拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ LambdaQueryChain or(LambdaQueryChain chain);
+
+ /**
+ * 直接以or拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ NamedQueryChain or(NamedQueryChain chain);
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/README.md b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/README.md
new file mode 100644
index 0000000..3aacfde
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/README.md
@@ -0,0 +1,4 @@
+# 查询构建Fluent Api适配器
+同时适配关系型数据库mysql和非关系型数据库mongodb
+
+未来将会支持更多,采用覆盖的方式进行对象组合
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultLambdaQueryChain.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultLambdaQueryChain.java
new file mode 100644
index 0000000..7dbbe4f
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultLambdaQueryChain.java
@@ -0,0 +1,42 @@
+package com.flyfish.framework.query.chain;
+
+import com.flyfish.framework.domain.base.Domain;
+import com.flyfish.framework.query.LambdaQueryChain;
+import com.flyfish.framework.query.QueryCondition;
+import com.flyfish.framework.query.support.DomainFunction;
+
+/**
+ * 默认按lambda的查询链实现
+ *
+ * @author wangyu
+ */
+public class DefaultLambdaQueryChain extends DefaultQueryChain, DomainFunction> implements LambdaQueryChain {
+
+ private QueryCondition> createCondition(DomainFunction column) {
+ return createCondition(column.getName());
+ }
+
+ /**
+ * 以且连接下一个字段
+ *
+ * @param column 列
+ * @return 查询条件
+ */
+ @Override
+ public QueryCondition> and(DomainFunction column) {
+ and();
+ return createCondition(column);
+ }
+
+ /**
+ * 以或连接下一个字段
+ *
+ * @param column 列
+ * @return 查询条件
+ */
+ @Override
+ public QueryCondition> or(DomainFunction column) {
+ or();
+ return createCondition(column);
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultNamedQueryChain.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultNamedQueryChain.java
new file mode 100644
index 0000000..6ae97e4
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultNamedQueryChain.java
@@ -0,0 +1,37 @@
+package com.flyfish.framework.query.chain;
+
+import com.flyfish.framework.query.NamedQueryChain;
+import com.flyfish.framework.query.QueryCondition;
+
+/**
+ * 默认按名称的查询链实现
+ *
+ * @author wangyu
+ */
+public class DefaultNamedQueryChain extends DefaultQueryChain implements NamedQueryChain {
+
+ /**
+ * 以且连接下一个字段
+ *
+ * @param column 列
+ * @return 查询条件
+ */
+ @Override
+ public QueryCondition and(String column) {
+ and();
+ return createCondition(column);
+ }
+
+ /**
+ * 以或连接下一个字段
+ *
+ * @param column 列
+ * @return 查询条件
+ */
+ @Override
+ public QueryCondition or(String column) {
+ or();
+ return createCondition(column);
+ }
+
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryChain.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryChain.java
new file mode 100644
index 0000000..602cf15
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryChain.java
@@ -0,0 +1,190 @@
+package com.flyfish.framework.query.chain;
+
+import com.flyfish.framework.query.Queries;
+import com.flyfish.framework.query.QueryChain;
+import com.flyfish.framework.query.QueryCondition;
+import com.flyfish.framework.query.QueryMutation;
+import com.flyfish.framework.query.holder.QueryChainHolder;
+import com.flyfish.framework.query.spi.adaptor.CriteriaAdaptor;
+import lombok.Getter;
+import org.springframework.data.util.CastUtils;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+/**
+ * 默认的查询定义,交给holder提供构建
+ * 在执行时,我们并不知道adaptor是谁,只有最后构建阶段才能明确
+ *
+ * @author wangyu
+ */
+@Getter
+abstract class DefaultQueryChain, P> implements QueryChain {
+
+ protected final DefaultQueryChainHolder> holder = new DefaultQueryChainHolder<>();
+
+ /**
+ * 以且的关系进行拼接
+ *
+ * @return 结果
+ */
+ protected QueryChainHolder> and() {
+ return holder.link(adaptor -> adaptor::and);
+ }
+
+ /**
+ * 以或的关系进行拼接
+ *
+ * @return 结果
+ */
+ protected QueryChainHolder> or() {
+ return holder.link(adaptor -> adaptor::or);
+ }
+
+ /**
+ * 创建条件,使用默认实现的条件
+ *
+ * @param column 列名
+ * @return 结果
+ */
+ protected QueryCondition createCondition(String column) {
+ return new DefaultQueryCondition<>(self(), holder, column);
+ }
+
+ /**
+ * 返回自身真实类型
+ *
+ * @return 结果
+ */
+ private C self() {
+ return CastUtils.cast(this);
+ }
+
+ /**
+ * 构建结果
+ *
+ * @param adaptor 查询适配器
+ * @return 构建结果
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public T build(CriteriaAdaptor adaptor) {
+ QueryChainHolder casted = (QueryChainHolder) holder;
+ return casted.get(adaptor);
+ }
+
+ /**
+ * 修改,此修改会直接接着查询条件进行拼接
+ *
+ * @return 修改句柄
+ */
+ @Override
+ public QueryMutation mutate() {
+ return new DefaultQueryMutation(this, false);
+ }
+
+ /**
+ * 会直接添加嵌套查询到当前查询末尾
+ *
+ * @return 修改句柄
+ */
+ @Override
+ public QueryMutation within() {
+ return new DefaultQueryMutation(this, true);
+ }
+
+ /**
+ * 判断查询条件是否为空
+ *
+ * @return 结果
+ */
+ @Override
+ public boolean isEmpty() {
+ return holder.isEmpty();
+ }
+
+ /**
+ * 直接拼接提供者,此处懒加载,最终build才会执行
+ *
+ * @param supplier 提供者
+ * @return 结果
+ */
+ @Override
+ public > C and(Supplier> supplier) {
+ and().with(adaptor -> supplier.get().build(adaptor));
+ return self();
+ }
+
+ /**
+ * 条件列表
+ *
+ * @param chain 多个条件们
+ * @return 结果
+ */
+ @Override
+ public > C and(QueryChain chain) {
+ and().with(chain::build);
+ return self();
+ }
+
+ /**
+ * 多个嵌套子条件列表
+ *
+ * @param chains 多条链
+ * @param combinator 各个链条之间的连接方式
+ * @return 结果
+ */
+ @Override
+ public > C and(List> chains, Queries.Combinator combinator) {
+ return and(combine(chains, combinator));
+ }
+
+ /**
+ * 以或连接条件列表
+ *
+ * @param chain 多个条件们
+ * @return 结果
+ */
+ @Override
+ public > C or(QueryChain chain) {
+ or().with(chain::build);
+ return self();
+ }
+
+ /**
+ * 以或连接嵌套多个子条件列表
+ *
+ * @param chains 多条链
+ * @param combinator 各个链条之间的连接方式
+ * @return 结果
+ */
+ @Override
+ public > C or(List> chains, Queries.Combinator combinator) {
+ return or(combine(chains, combinator));
+ }
+
+ /**
+ * 直接拼接提供者,此处懒加载,最终build才会执行
+ *
+ * @param supplier 提供者
+ * @return 结果
+ */
+ @Override
+ public > C or(Supplier> supplier) {
+ or().with(adaptor -> supplier.get().build(adaptor));
+ return self();
+ }
+
+ /**
+ * 结合多个查询链,并根据组合方式进行处理
+ *
+ * @param chains 查询链集合
+ * @param combinator 组合方式
+ * @return 结果
+ */
+ private > C combine(List> chains, Queries.Combinator combinator) {
+ return chains.stream().reduce((left, right) -> combinator == Queries.Combinator.OR ? left.or(right) : left.and(right))
+ .map(this::and)
+ .orElse(self());
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryChainHolder.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryChainHolder.java
new file mode 100644
index 0000000..f06f290
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryChainHolder.java
@@ -0,0 +1,59 @@
+package com.flyfish.framework.query.chain;
+
+import com.flyfish.framework.query.holder.QueryChainHolder;
+import com.flyfish.framework.query.spi.adaptor.CriteriaAdaptor;
+
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+
+/**
+ * 默认的查询保持器
+ *
+ * @param 泛型,交给适配器处理
+ */
+class DefaultQueryChainHolder implements QueryChainHolder {
+
+ /**
+ * 等待下一步消费
+ * 如果不调用with,该状态将一直保持,可被其他link调用替换
+ * 在调用with后,自动消费,并完成拼接
+ *
+ * @param operator 操作方法
+ * @return 本身
+ */
+ @Override
+ public QueryChainHolder link(Function, BinaryOperator> operator) {
+ return null;
+ }
+
+ /**
+ * 拼接条件
+ *
+ * @param criteria 条件
+ */
+ @Override
+ public void with(Function, C> criteria) {
+
+ }
+
+
+ /**
+ * 触发动作,得到最终的
+ *
+ * @return 本身
+ */
+ @Override
+ public C get(CriteriaAdaptor adaptor) {
+ return null;
+ }
+
+ /**
+ * 判断条件是否为空
+ *
+ * @return 结果
+ */
+ @Override
+ public boolean isEmpty() {
+ return false;
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryCondition.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryCondition.java
new file mode 100644
index 0000000..aff1424
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryCondition.java
@@ -0,0 +1,258 @@
+package com.flyfish.framework.query.chain;
+
+import com.flyfish.framework.query.Queries;
+import com.flyfish.framework.query.QueryChain;
+import com.flyfish.framework.query.QueryCondition;
+import com.flyfish.framework.query.holder.QueryChainHolder;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 条件操作实现
+ *
+ * @author wangyu
+ */
+@RequiredArgsConstructor
+class DefaultQueryCondition> implements QueryCondition {
+
+ private final C chain;
+ private final QueryChainHolder> holder;
+ private final String column;
+
+ /**
+ * 相等判定
+ *
+ * @param value 值
+ * @return 结果
+ */
+ @Override
+ public C eq(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.eq(column, value));
+ }
+ return chain;
+ }
+
+ /**
+ * 判定某列的值中存在指定值,特指json array数据类型且子类型中带有id的场景
+ * 用于兼容mongodb查询,mysql查询使用JSON_CONTAINS进行判定。
+ * 当且仅当mongodb会拼接.$id,mysql一律匹配id字段
+ *
+ * 等价于 .eq(value)
+ *
+ * @param value 值
+ * @return 结果
+ */
+ @Override
+ public C hasId(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.hasId(column, value));
+ }
+ return chain;
+ }
+
+ /**
+ * 对于mongodb,自动处理。对于关系型数据库,代表json array中是否包含对应值,值仅支持基本数据类型
+ *
+ * 等价于 .eq(value)
+ *
+ * @param value 基本数据类型的值
+ * @return 结果
+ */
+ @Override
+ public C has(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.has(column, value));
+ }
+ return chain;
+ }
+
+ /**
+ * 不等判定
+ *
+ * @param value 值
+ * @return 结果
+ */
+ @Override
+ public C ne(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.ne(column, value));
+ }
+ return chain;
+ }
+
+ /**
+ * 值介于两者之间
+ *
+ * @param items 双值列表
+ * @return 结果
+ */
+ @Override
+ public C between(List> items) {
+ if (CollectionUtils.size(items) == 2) {
+ holder.with(adaptor -> adaptor.between(column, items));
+ }
+ return chain;
+ }
+
+ /**
+ * 模糊匹配,这里是全模糊
+ *
+ * @param keyword 查询关键字
+ * @return 结果
+ */
+ @Override
+ public C like(String keyword) {
+ if (StringUtils.isNotBlank(keyword)) {
+ holder.with(adaptor -> adaptor.like(column, keyword, Queries.Direction.ALL));
+ }
+ return chain;
+ }
+
+ /**
+ * 根据指定的方向进行模糊查询
+ *
+ * @param keyword 关键字
+ * @param direction 方向,可以匹配开头和结尾
+ * @return 结果
+ */
+ @Override
+ public C like(String keyword, Queries.Direction direction) {
+ if (StringUtils.isNotBlank(keyword)) {
+ holder.with(adaptor -> adaptor.like(column, keyword, direction));
+ }
+ return chain;
+ }
+
+ /**
+ * 判定为空
+ *
+ * @return 结果
+ */
+ @Override
+ public C isNull() {
+ holder.with(adaptor -> adaptor.isNull(column));
+ return chain;
+ }
+
+ /**
+ * 包含在内
+ *
+ * @param list 集合
+ * @return 结果
+ */
+ @Override
+ public C in(Collection> list) {
+ if (CollectionUtils.isNotEmpty(list)) {
+ holder.with(adaptor -> adaptor.in(column, list));
+ }
+ return chain;
+ }
+
+ /**
+ * 包含在内
+ * 注意,需要根据字段类型推断。
+ * 如果是json数组,需要进行双向匹配
+ *
+ * @param values 值们
+ * @return 结果
+ */
+ @Override
+ public C in(Object... values) {
+ if (ArrayUtils.isNotEmpty(values)) {
+ holder.with(adaptor -> adaptor.in(column, values));
+ }
+ return chain;
+ }
+
+ /**
+ * 不包含在内
+ * 注意,需要根据字段类型推断。
+ * 如果是json数组,需要进行双向匹配
+ *
+ * @param values 值们
+ * @return 结果
+ */
+ @Override
+ public C nin(Object... values) {
+ if (ArrayUtils.isNotEmpty(values)) {
+ holder.with(adaptor -> adaptor.nin(column, values));
+ }
+ return chain;
+ }
+
+ /**
+ * 不包含在内
+ *
+ * @param values 集合
+ * @return 结果
+ */
+ @Override
+ public C nin(Collection> values) {
+ if (CollectionUtils.isNotEmpty(values)) {
+ holder.with(adaptor -> adaptor.nin(column, values));
+ }
+ return chain;
+ }
+
+ /**
+ * 小于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ @Override
+ public C lt(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.lt(column, value));
+ }
+ return chain;
+ }
+
+ /**
+ * 小于等于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ @Override
+ public C lte(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.lte(column, value));
+ }
+ return chain;
+ }
+
+ /**
+ * 大于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ @Override
+ public C gt(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.gt(column, value));
+ }
+ return chain;
+ }
+
+ /**
+ * 大于等于指定的值
+ *
+ * @param value 类型
+ * @return 结果
+ */
+ @Override
+ public C gte(Object value) {
+ if (null != value) {
+ holder.with(adaptor -> adaptor.gte(column, value));
+ }
+ return chain;
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryMutation.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryMutation.java
new file mode 100644
index 0000000..ebe1916
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/chain/DefaultQueryMutation.java
@@ -0,0 +1,120 @@
+package com.flyfish.framework.query.chain;
+
+import com.flyfish.framework.domain.base.Domain;
+import com.flyfish.framework.query.*;
+import com.flyfish.framework.query.support.DomainFunction;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 默认的查询修改逻辑
+ *
+ * @author wangyu
+ *
+ * 不修改原条件,而是在此基础上新增
+ * 理论上查询不允许直接修改,而是通过该类做一个桥接
+ * 也可以修改链的形式
+ */
+@RequiredArgsConstructor
+public class DefaultQueryMutation implements QueryMutation {
+
+ private final QueryChain, ?> previous;
+
+ private final boolean within;
+
+ /**
+ * 以lambda的形式修改
+ * 注意,如果之前用过lambda的形式,此处应该校验类型
+ *
+ * @param getter 方法引用
+ * @return 结果
+ */
+ @Override
+ public QueryCondition> and(DomainFunction getter) {
+ LambdaQueryChain newChain = new DefaultLambdaQueryChain<>();
+ QueryCondition> condition = newChain.and(getter);
+ List> chains = Arrays.asList(previous, newChain);
+ previous.and(chains);
+ return condition;
+ }
+
+ /**
+ * 以column的形式修改
+ *
+ * @param column 列名
+ * @return 结果
+ */
+ @Override
+ public QueryCondition and(String column) {
+ return null;
+ }
+
+ /**
+ * 直接以and拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ @Override
+ public LambdaQueryChain and(LambdaQueryChain chain) {
+ return null;
+ }
+
+ /**
+ * 直接以and拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ @Override
+ public NamedQueryChain and(NamedQueryChain chain) {
+ return null;
+ }
+
+ /**
+ * 以lambda的形式修改
+ * 注意,如果之前用过lambda的形式,此处应该校验类型
+ *
+ * @param getter 方法引用
+ * @return 结果
+ */
+ @Override
+ public QueryCondition> or(DomainFunction getter) {
+ return null;
+ }
+
+ /**
+ * 以column的形式修改
+ *
+ * @param column 列名
+ * @return 结果
+ */
+ @Override
+ public QueryCondition or(String column) {
+ return null;
+ }
+
+ /**
+ * 直接以or拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ @Override
+ public LambdaQueryChain or(LambdaQueryChain chain) {
+ return null;
+ }
+
+ /**
+ * 直接以or拼接其他的所有条件
+ *
+ * @param chain 传入的查询
+ * @return 结果
+ */
+ @Override
+ public NamedQueryChain or(NamedQueryChain chain) {
+ return null;
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/holder/QueryChainHolder.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/holder/QueryChainHolder.java
new file mode 100644
index 0000000..71afc87
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/holder/QueryChainHolder.java
@@ -0,0 +1,45 @@
+package com.flyfish.framework.query.holder;
+
+import com.flyfish.framework.query.spi.adaptor.CriteriaAdaptor;
+
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+
+/**
+ * 查询链保持器,将所有拼接工作后置,可以做检查和处理
+ *
+ * @author wangyu
+ */
+public interface QueryChainHolder {
+
+ /**
+ * 等待下一步消费
+ * 如果不调用with,该状态将一直保持,可被其他link调用替换
+ * 在调用with后,自动消费,并完成拼接
+ *
+ * @param operator 操作方法
+ * @return 本身
+ */
+ QueryChainHolder link(Function, BinaryOperator> operator);
+
+ /**
+ * 拼接条件
+ *
+ * @param criteria 条件
+ */
+ void with(Function, C> criteria);
+
+ /**
+ * 触发动作,得到最终的
+ *
+ * @return 本身
+ */
+ C get(CriteriaAdaptor adaptor);
+
+ /**
+ * 判断条件是否为空
+ *
+ * @return 结果
+ */
+ boolean isEmpty();
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/QueryChainFactory.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/QueryChainFactory.java
new file mode 100644
index 0000000..d216822
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/QueryChainFactory.java
@@ -0,0 +1,22 @@
+package com.flyfish.framework.query.spi;
+
+import com.flyfish.framework.query.QueryChain;
+import com.flyfish.framework.utils.Supportable;
+
+/**
+ * 查询链创建抽象泛型工厂
+ * 基于spi提供实现类,最终返回真正实例化的内容
+ * 根据引入的jar包自动加载,无需手动处理
+ *
+ * @author wangyu
+ */
+public interface QueryChainFactory> extends Supportable> {
+
+ /**
+ * 生产适配器
+ * 此接口为高度抽象接口,目的是兼容更多的查询链类型,便于后续扩展
+ *
+ * @return 生产结果
+ */
+ C produce();
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/QueryFactory.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/QueryFactory.java
new file mode 100644
index 0000000..32fa546
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/QueryFactory.java
@@ -0,0 +1,31 @@
+package com.flyfish.framework.query.spi;
+
+import com.flyfish.framework.domain.base.Domain;
+import com.flyfish.framework.query.spi.adaptor.CriteriaAdaptor;
+import com.flyfish.framework.query.spi.converter.QueryConverter;
+import com.flyfish.framework.utils.Supportable;
+import org.springframework.data.repository.core.EntityInformation;
+
+/**
+ * 查询工厂,提供统一的实例
+ *
+ * @param 查询条件对象泛型
+ * @param 查询对象泛型
+ * @author wangyu
+ */
+public interface QueryFactory extends Supportable> {
+
+ /**
+ * 获取查询转换器
+ *
+ * @return 结果
+ */
+ QueryConverter getConverter();
+
+ /**
+ * 获取查询适配器
+ *
+ * @return 结果
+ */
+ CriteriaAdaptor getAdaptor();
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/adaptor/CriteriaAdaptor.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/adaptor/CriteriaAdaptor.java
new file mode 100644
index 0000000..4326283
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/adaptor/CriteriaAdaptor.java
@@ -0,0 +1,180 @@
+package com.flyfish.framework.query.spi.adaptor;
+
+import com.flyfish.framework.query.Queries;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 查询适配器
+ * 直接根据条件操作得到查询条件片段
+ * 适配不同的数据库抽取通用操作
+ *
+ * @author wangyu
+ * 由工厂进行实例化,并输出
+ */
+public interface CriteriaAdaptor {
+
+ /**
+ * 且的关系进行拼接
+ *
+ * @param first 起始条件
+ * @param other 其他条件
+ * @return 结果
+ */
+ C and(C first, C other);
+
+ /**
+ * 或的关系进行拼接
+ *
+ * @param first 起始条件
+ * @param other 其他条件
+ * @return 结果
+ */
+ C or(C first, C other);
+
+ /**
+ * 相等判定
+ *
+ * @param column 列名
+ * @param value 值
+ * @return 结果
+ */
+ C eq(String column, Object value);
+
+ /**
+ * 判定某列的值中存在指定值,特指json array数据类型且子类型中带有id的场景
+ * 用于兼容mongodb查询,mysql查询使用JSON_CONTAINS进行判定。
+ * 当且仅当mongodb会拼接.$id,mysql一律匹配id字段
+ *
+ * 等价于 .eq(value)
+ *
+ * @param column 列名
+ * @param value 值
+ * @return 结果
+ */
+ C hasId(String column, Object value);
+
+ /**
+ * 对于mongodb,自动处理。对于关系型数据库,代表json array中是否包含对应值,值仅支持基本数据类型
+ *
+ * 等价于 .eq(value)
+ *
+ * @param column 列名
+ * @param value 基本数据类型的值
+ * @return 结果
+ */
+ C has(String column, Object value);
+
+ /**
+ * 不等判定
+ *
+ * @param column 列名
+ * @param value 值
+ * @return 结果
+ */
+ C ne(String column, Object value);
+
+ /**
+ * 值介于两者之间
+ *
+ * @param column 列名
+ * @param items 双值列表
+ * @return 结果
+ */
+ C between(String column, List> items);
+
+ /**
+ * 根据指定的方向进行模糊查询
+ *
+ * @param column 列名
+ * @param keyword 关键字
+ * @param direction 方向,可以匹配开头和结尾
+ * @return 结果
+ */
+ C like(String column, String keyword, Queries.Direction direction);
+
+ /**
+ * 判定为空
+ *
+ * @param column 列名
+ * @return 结果
+ */
+ C isNull(String column);
+
+ /**
+ * 小于指定的值
+ *
+ * @param column 列名
+ * @param value 类型
+ * @return 结果
+ */
+ C lt(String column, Object value);
+
+ /**
+ * 小于等于指定的值
+ *
+ * @param column 列名
+ * @param value 类型
+ * @return 结果
+ */
+ C lte(String column, Object value);
+
+ /**
+ * 大于指定的值
+ *
+ * @param column 列名
+ * @param value 类型
+ * @return 结果
+ */
+ C gt(String column, Object value);
+
+ /**
+ * 大于等于指定的值
+ *
+ * @param column 列名
+ * @param value 类型
+ * @return 结果
+ */
+ C gte(String column, Object value);
+
+ /**
+ * 包含在内
+ *
+ * @param column 列名
+ * @param values 集合
+ * @return 结果
+ */
+ C in(String column, Collection> values);
+
+ /**
+ * 包含在内
+ * 注意,需要根据字段类型推断。
+ * 如果是json数组,需要进行双向匹配
+ *
+ * @param column 列名
+ * @param values 值们
+ * @return 结果
+ */
+ C in(String column, Object... values);
+
+ /**
+ * 不包含在内
+ * 注意,需要根据字段类型推断。
+ * 如果是json数组,需要进行双向匹配
+ *
+ * @param column 列名
+ * @param values 值们
+ * @return 结果
+ */
+ C nin(String column, Object... values);
+
+ /**
+ * 不包含在内
+ *
+ * @param column 列名
+ * @param values 集合
+ * @return 结果
+ */
+ C nin(String column, Collection> values);
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/converter/QueryConverter.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/converter/QueryConverter.java
new file mode 100644
index 0000000..ca7cb9f
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/spi/converter/QueryConverter.java
@@ -0,0 +1,19 @@
+package com.flyfish.framework.query.spi.converter;
+
+import com.flyfish.framework.query.Query;
+
+/**
+ * 原生查询转换器
+ *
+ * @author wangyu
+ */
+public interface QueryConverter {
+
+ /**
+ * 转换查询
+ *
+ * @param query 封装的查询
+ * @return 本地查询
+ */
+ T convert(Query query);
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/DomainFunction.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/DomainFunction.java
new file mode 100644
index 0000000..21aa93a
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/DomainFunction.java
@@ -0,0 +1,21 @@
+package com.flyfish.framework.query.support;
+
+import com.flyfish.framework.domain.base.Domain;
+
+/**
+ * 支持序列化的实体方法
+ *
+ * @param 泛型,父类为实体
+ */
+@FunctionalInterface
+public interface DomainFunction extends SFunction {
+
+ /**
+ * 快速获取名称
+ *
+ * @return 序列化后的名称
+ */
+ default String getName() {
+ return EntityNameUtils.getName(this);
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/EntityNameUtils.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/EntityNameUtils.java
new file mode 100644
index 0000000..5bc9dcc
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/EntityNameUtils.java
@@ -0,0 +1,170 @@
+package com.flyfish.framework.query.support;
+
+
+import com.flyfish.framework.annotations.Property;
+import com.flyfish.framework.utils.LRUCache;
+import org.springframework.core.annotation.MergedAnnotations;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.security.InvalidParameterException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class EntityNameUtils {
+
+ // SerializedLambda 反序列化缓存
+ private static final Map> FUNC_CACHE = new ConcurrentHashMap<>();
+
+ // 列别名缓存
+ private static final Map, Map> COLUMN_CACHE = new LRUCache<>(5);
+
+ private static final String MONGO_FIELD = "org.springframework.data.mongodb.core.mapping.Field";
+
+ private static final String RELATIONAL_COLUMN = "org.springframework.data.relational.core.mapping.Column";
+
+ /**
+ * 方法转为属性
+ *
+ * @param name 方法名称
+ * @return 最终属性
+ */
+ public static String methodToProperty(String name) {
+ if (name.startsWith("is")) {
+ name = name.substring(2);
+ } else {
+ if (!name.startsWith("get") && !name.startsWith("set")) {
+ throw new InvalidParameterException("不是正确的getter或setter");
+ }
+ name = name.substring(3);
+ }
+ if (name.length() == 1 || name.length() > 1 && !Character.isUpperCase(name.charAt(1))) {
+ name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
+ }
+ return name;
+ }
+
+ /**
+ * 将驼峰命名转化成下划线
+ *
+ * @param param 参数
+ * @return 结果
+ */
+ public static String camelToUnderline(String param) {
+ if (param.length() < 3) {
+ return param.toLowerCase();
+ }
+ StringBuilder sb = new StringBuilder(param);
+ int temp = 0;//定位
+ //从第三个字符开始 避免命名不规范
+ for (int i = 2; i < param.length(); i++) {
+ if (Character.isUpperCase(param.charAt(i))) {
+ sb.insert(i + temp, "_");
+ temp += 1;
+ }
+ }
+ return sb.toString().toLowerCase();
+ }
+
+ /**
+ * 解析列并使用处理函数处理
+ *
+ * @param func 方法引用
+ * @param 实体泛型
+ * @return 处理结果
+ */
+ public static String getName(SFunction func) {
+ SerializedLambda lambda = resolve(func);
+ String property = methodToProperty(lambda.getImplMethodName());
+ Class> beanClass = resolveEntityClass(lambda);
+ return tryCache(beanClass).getOrDefault(property, property);
+ }
+
+ /**
+ * 解析获得实体类
+ *
+ * @param lambda 序列化的lambda
+ * @return 最终获取的类
+ */
+ private static Class> resolveEntityClass(SerializedLambda lambda) {
+ Class> type = lambda.getInstantiatedType();
+ tryCache(type);
+ return type;
+ }
+
+ /**
+ * 尝试缓存
+ *
+ * @param entityClass bean的类型
+ */
+ private static Map tryCache(Class> entityClass) {
+ return COLUMN_CACHE.computeIfAbsent(entityClass, EntityNameUtils::buildFieldsCache);
+ }
+
+
+ /**
+ * 构建字段缓存
+ *
+ * @param type 类型
+ * @return 构建后的缓存
+ */
+ private static Map buildFieldsCache(Class> type) {
+ Map fields = new HashMap<>();
+ ReflectionUtils.doWithFields(type, field -> fields.put(field.getName(), resolveFinalName(field)));
+ return fields;
+ }
+
+
+ /**
+ * 解析字段注解或直接取用下划线逻辑
+ *
+ * @return 解析结果
+ */
+ private static String resolveFinalName(Field field) {
+ MergedAnnotations annotations = MergedAnnotations.from(field);
+ if (annotations.isPresent(Property.class)) {
+ String key = annotations.get(Property.class).getString("key");
+ if (StringUtils.hasText(key)) {
+ return key;
+ }
+ }
+ if (annotations.isPresent(MONGO_FIELD)) {
+ String name = annotations.get(MONGO_FIELD).getString("name");
+ if (StringUtils.hasText(name)) {
+ return name;
+ }
+ }
+ if (annotations.isPresent(RELATIONAL_COLUMN)) {
+ String name = annotations.get(RELATIONAL_COLUMN).getString("value");
+ if (StringUtils.hasText(name)) {
+ return name;
+ }
+ }
+ return field.getName();
+ }
+
+ /**
+ * 解析方法引用为序列化lambda实例
+ * 该方式会使用缓存
+ *
+ * @param func 方法引用
+ * @param 泛型
+ * @return 解析结果
+ */
+ private static SerializedLambda resolve(SFunction func) {
+ Class> clazz = func.getClass();
+ String name = clazz.getName();
+ return Optional.ofNullable(FUNC_CACHE.get(name))
+ .map(WeakReference::get)
+ .orElseGet(() -> {
+ SerializedLambda lambda = SerializedLambda.resolve(func);
+ FUNC_CACHE.put(name, new WeakReference<>(lambda));
+ return lambda;
+ });
+ }
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/SFunction.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/SFunction.java
new file mode 100644
index 0000000..ccffeb9
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/SFunction.java
@@ -0,0 +1,14 @@
+package com.flyfish.framework.query.support;
+
+import java.io.Serializable;
+import java.util.function.Function;
+
+/**
+ * 支持序列化的function
+ *
+ * @param 泛型入参
+ * @param 泛型返回值
+ */
+@FunctionalInterface
+public interface SFunction extends Function, Serializable {
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/SerializedLambda.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/SerializedLambda.java
new file mode 100644
index 0000000..574a027
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/query/support/SerializedLambda.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2011-2021, baomidou (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.flyfish.framework.query.support;
+
+import lombok.Getter;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.SerializationUtils;
+
+import java.io.*;
+
+/**
+ * 这个类是从 {@link java.lang.invoke.SerializedLambda} 里面 copy 过来的,
+ * 字段信息完全一样
+ * 负责将一个支持序列的 Function 序列化为 SerializedLambda
+ *
+ * @author mbp
+ */
+@SuppressWarnings("unused")
+class SerializedLambda implements Serializable {
+
+ private static final long serialVersionUID = 8025925345765570181L;
+
+ private Class> capturingClass;
+ private String functionalInterfaceClass;
+ private String functionalInterfaceMethodName;
+ private String functionalInterfaceMethodSignature;
+ private String implClass;
+ /**
+ * -- GETTER --
+ * 获取实现者的方法名称
+ *
+ * @return 方法名称
+ */
+ @Getter
+ private String implMethodName;
+ private String implMethodSignature;
+ private int implMethodKind;
+ private String instantiatedMethodType;
+ private Object[] capturedArgs;
+
+ /**
+ * 通过反序列化转换 lambda 表达式,该方法只能序列化 lambda 表达式,不能序列化接口实现或者正常非 lambda 写法的对象
+ *
+ * @param lambda lambda对象
+ * @return 返回解析后的 SerializedLambda
+ */
+ public static SerializedLambda resolve(SFunction, ?> lambda) {
+ Assert.isTrue(lambda.getClass().isSynthetic(), "该方法仅能传入 lambda 表达式产生的合成类");
+ byte[] stream = SerializationUtils.serialize(lambda);
+ Assert.notNull(stream, "序列化类失败!");
+ try (ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(stream)) {
+ @Override
+ protected Class> resolveClass(ObjectStreamClass objectStreamClass) throws IOException, ClassNotFoundException {
+ Class> clazz;
+ try {
+ clazz = forName(objectStreamClass.getName());
+ } catch (Exception ex) {
+ clazz = super.resolveClass(objectStreamClass);
+ }
+ return clazz == java.lang.invoke.SerializedLambda.class ? SerializedLambda.class : clazz;
+ }
+ }) {
+ return (SerializedLambda) objIn.readObject();
+ } catch (ClassNotFoundException | IOException e) {
+ throw new NullPointerException("不应该发生这件事");
+ }
+ }
+
+ /**
+ * 以类名实例化类,会隐藏报错,需要在确定有该类的情况下调用
+ *
+ * @param name 类型
+ * @return 实例
+ */
+ private static Class> forName(String name) {
+ try {
+ return ClassUtils.forName(name, null);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ }
+
+ /**
+ * 获取接口 class
+ *
+ * @return 返回 class 名称
+ */
+ public String getFunctionalInterfaceClassName() {
+ return normalizedName(functionalInterfaceClass);
+ }
+
+ /**
+ * 获取实现的 class
+ *
+ * @return 实现类
+ */
+ public Class> getImplClass() {
+ return forName(getImplClassName());
+ }
+
+ /**
+ * 获取 class 的名称
+ *
+ * @return 类名
+ */
+ public String getImplClassName() {
+ return normalizedName(implClass);
+ }
+
+ /**
+ * 正常化类名称,将类名称中的 / 替换为 .
+ *
+ * @param name 名称
+ * @return 正常的类名
+ */
+ private String normalizedName(String name) {
+ return name.replace('/', '.');
+ }
+
+ /**
+ * @return 获取实例化方法的类型
+ */
+ public Class> getInstantiatedType() {
+ String instantiatedTypeName = normalizedName(instantiatedMethodType.substring(2, instantiatedMethodType.indexOf(';')));
+ return forName(instantiatedTypeName);
+ }
+
+ /**
+ * @return 字符串形式
+ */
+ @Override
+ public String toString() {
+ String interfaceName = getFunctionalInterfaceClassName();
+ String implName = getImplClassName();
+ return String.format("%s -> %s::%s",
+ interfaceName.substring(interfaceName.lastIndexOf('.') + 1),
+ implName.substring(implName.lastIndexOf('.') + 1),
+ implMethodName);
+ }
+
+}
diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/repository/DefaultReactiveRepository.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/repository/DefaultReactiveRepository.java
new file mode 100644
index 0000000..19ded1c
--- /dev/null
+++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/repository/DefaultReactiveRepository.java
@@ -0,0 +1,50 @@
+package com.flyfish.framework.repository;
+
+import com.flyfish.framework.repository.base.DomainRepository;
+import org.reactivestreams.Publisher;
+import org.springframework.data.repository.NoRepositoryBean;
+import org.springframework.data.repository.reactive.ReactiveCrudRepository;
+import org.springframework.lang.NonNull;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+
+/**
+ * 默认的持久层dao
+ *
+ * @param 泛型
+ */
+@NoRepositoryBean
+public interface DefaultReactiveRepository extends ReactiveCrudRepository, ReactiveQueryModelExecutor