@@ -41,14 +41,25 @@ public interface Fn<T, R> extends Function<T, R>, Serializable {
4141 */
4242 Map <Fn , Reflections .ClassField > FN_CLASS_FIELD_MAP = new HashMap <>();
4343
44+ /**
45+ * 指定字段集合的虚拟表,当通过基类或者泛型基类获取字段时,需要设置字段所属的实体类
46+ *
47+ * @param entityClass 当使用基类获取泛型时,需要指定实体类类型
48+ * @param fns 指定字段
49+ * @return 虚拟表
50+ */
51+ static <E > Fns <E > of (Class <E > entityClass , Fn <E , Object >... fns ) {
52+ return new Fns <>(entityClass , fns );
53+ }
54+
4455 /**
4556 * 指定字段集合的虚拟表
4657 *
4758 * @param fns 指定字段
4859 * @return 虚拟表
4960 */
5061 static <E > Fns <E > of (Fn <E , Object >... fns ) {
51- return new Fns <>( fns );
62+ return of ( null , fns );
5263 }
5364
5465 /**
@@ -66,6 +77,17 @@ static <E> Fns<E> of(Class<E> entityClass, String... columnNames) {
6677 return new Fns <>(entityClass , entityTable .tableName (), columns );
6778 }
6879
80+ /**
81+ * 当前字段所属的实体类,当实体存在继承关系时
82+ * 父类的方法引用无法获取字段所属的实体类,需要通过该方法指定
83+ *
84+ * @param entityClass 指定实体类
85+ * @return 带有指定实体类的 Fn
86+ */
87+ default Fn <T , R > in (Class <?> entityClass ) {
88+ return new FnImpl <>(this , entityClass );
89+ }
90+
6991 /**
7092 * 转换为字段:获取方法引用对应的字段信息
7193 *
@@ -125,6 +147,26 @@ default EntityColumn toEntityColumn() {
125147 return FN_COLUMN_MAP .get (this );
126148 }
127149
150+ /**
151+ * 带有指定类型的方法引用
152+ */
153+ class FnImpl <T , R > implements Fn <T , R > {
154+
155+ final Fn <T , R > fn ;
156+ final Class <?> entityClass ;
157+
158+ public FnImpl (Fn <T , R > fn , Class <?> entityClass ) {
159+ this .fn = fn ;
160+ this .entityClass = entityClass ;
161+ }
162+
163+ @ Override
164+ public R apply (T t ) {
165+ return fn .apply (t );
166+ }
167+
168+ }
169+
128170 /**
129171 * 字段数组,用于获取字段对应的所有字段名和列名,当前对象相当于一个部分字段的虚拟表
130172 *
@@ -150,14 +192,19 @@ private Fns(Class<E> entityClass, String table, List<EntityColumn> columns) {
150192 *
151193 * @param fns 字段数组
152194 */
153- private Fns (Fn <E , Object >... fns ) {
154- super (null );
195+ private Fns (Class < E > entityClass , Fn <E , Object >... fns ) {
196+ super (entityClass );
155197 this .columns = new ArrayList <>(fns .length );
156198 for (int i = 0 ; i < fns .length ; i ++) {
157- this .columns .add (fns [i ].toEntityColumn ());
199+ if (entityClass != null ) {
200+ this .columns .add (fns [i ].in (entityClass ).toEntityColumn ());
201+ } else {
202+ this .columns .add (fns [i ].toEntityColumn ());
203+ }
158204 if (i == 0 ) {
159205 EntityTable entityTable = this .columns .get (i ).entityTable ();
160206 this .table = entityTable .tableName ();
207+ this .style = entityTable .style ();
161208 this .entityClass = entityTable .entityClass ();
162209 this .resultMap = entityTable .resultMap ();
163210 this .autoResultMap = entityTable .autoResultMap ();
0 commit comments