mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
feat: add fill
This commit is contained in:
parent
52a0eb3cc9
commit
27444dda74
@ -57,14 +57,14 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object intercept(Invocation invocation) throws Throwable {
|
public Object intercept(Invocation invocation) throws Throwable {
|
||||||
|
Object ew = null;
|
||||||
Object[] args = invocation.getArgs();
|
Object[] args = invocation.getArgs();
|
||||||
if (args[0] instanceof MappedStatement) {
|
if (args[0] instanceof MappedStatement) {
|
||||||
MappedStatement ms = (MappedStatement) args[0];
|
MappedStatement ms = (MappedStatement) args[0];
|
||||||
if (args[1] instanceof Map) {
|
if (args[1] instanceof Map) {
|
||||||
Map<String, Object> map = (Map<String, Object>) args[1];
|
Map<String, Object> map = (Map<String, Object>) args[1];
|
||||||
Object ew = map.getOrDefault(Constants.WRAPPER, null);
|
ew = map.getOrDefault(Constants.WRAPPER, null);
|
||||||
if (Objects.nonNull(ew) && ew instanceof MPJBaseJoin) {
|
if (Objects.nonNull(ew) && ew instanceof MPJBaseJoin) {
|
||||||
if (CollectionUtils.isNotEmpty(map)) {
|
|
||||||
Class<?> rt = null;
|
Class<?> rt = null;
|
||||||
if (map.containsKey(Constant.CLAZZ) && map.get(Constant.CLAZZ) != null) {
|
if (map.containsKey(Constant.CLAZZ) && map.get(Constant.CLAZZ) != null) {
|
||||||
rt = (Class<?>) map.get(Constant.CLAZZ);
|
rt = (Class<?>) map.get(Constant.CLAZZ);
|
||||||
@ -84,8 +84,7 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return fill(ew, invocation.proceed());
|
||||||
return invocation.proceed();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -362,6 +361,24 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Object fill(Object ew, Object proceed) {
|
||||||
|
if (Objects.isNull(ew) || !(ew instanceof SelectWrapper<?, ?>) || MPJReflectionKit.isPrimitiveOrWrapper(proceed.getClass())) {
|
||||||
|
return proceed;
|
||||||
|
}
|
||||||
|
if (proceed instanceof List) {
|
||||||
|
List<?> list = (List<?>) proceed;
|
||||||
|
if (!list.isEmpty()) {
|
||||||
|
Object o = list.stream().filter(Objects::nonNull).findFirst().orElse(null);
|
||||||
|
if (o == null || MPJReflectionKit.isPrimitiveOrWrapper(o.getClass())) {
|
||||||
|
return proceed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SelectWrapper<?, ?> selectWrapper = (SelectWrapper<?, ?>) ew;
|
||||||
|
selectWrapper.doFill(proceed);
|
||||||
|
return proceed;
|
||||||
|
}
|
||||||
|
|
||||||
private Class<?> getMapper(String id, String resource) {
|
private Class<?> getMapper(String id, String resource) {
|
||||||
Class<?> clazz = MS_MAPPER_CACHE.computeIfAbsent(id, key -> {
|
Class<?> clazz = MS_MAPPER_CACHE.computeIfAbsent(id, key -> {
|
||||||
try {
|
try {
|
||||||
|
@ -0,0 +1,162 @@
|
|||||||
|
package com.github.yulichang.toolkit;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Assert;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||||
|
import com.github.yulichang.toolkit.support.FieldCache;
|
||||||
|
import com.github.yulichang.toolkit.support.LambdaMeta;
|
||||||
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
|
import com.github.yulichang.wrapper.interfaces.MConsumer;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充
|
||||||
|
*
|
||||||
|
* @auther yulichang
|
||||||
|
* @since 1.5.1
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({"unchecked", "unused"})
|
||||||
|
public final class FillUtils {
|
||||||
|
|
||||||
|
public static void fill(Object data, SFunction<?, ?> field, SFunction<?, ?> tagField) {
|
||||||
|
fill(data, field, tagField, (MConsumer<MPJLambdaWrapper<?>>) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void fill(Object data, SFunction<?, ?> field, SFunction<?, ?> tagField, MConsumer<MPJLambdaWrapper<?>> consumer) {
|
||||||
|
LambdaMeta meta = LambdaUtils.getMeta(tagField);
|
||||||
|
FieldCache fieldCache = MPJReflectionKit.getFieldMap(meta.getInstantiatedClass()).get(meta.getName());
|
||||||
|
fill(data, field, getTagClass(fieldCache.getField()), tagField, consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void fill(Object data, SFunction<?, ?> field, Class<?> oneClass, SFunction<?, ?> tagField) {
|
||||||
|
fill(data, field, oneClass, tagField, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void fill(Object data, SFunction<?, ?> field, Class<?> oneClass, SFunction<?, ?> tagField, MConsumer<MPJLambdaWrapper<?>> consumer) {
|
||||||
|
TableInfo tableInfo = TableHelper.getAssert(oneClass);
|
||||||
|
Assert.notNull(tableInfo.getKeyProperty(), "not found key property by class %s", oneClass.getName());
|
||||||
|
fill(data, field, new SF(oneClass, tableInfo.getKeyProperty()), tagField, consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void fill(Object data, SFunction<?, ?> field, SFunction<?, ?> oneField, SFunction<?, ?> tagField) {
|
||||||
|
fill(data, field, oneField, tagField, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void fill(Object data, SFunction<?, ?> field, SFunction<?, ?> oneField, SFunction<?, ?> tagField, MConsumer<MPJLambdaWrapper<?>> consumer) {
|
||||||
|
doFill(data, field, oneField, tagField, consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <W> void doFill(Object data, SFunction<?, ?> field, SFunction<?, ?> oneField, SFunction<?, ?> tagField, MConsumer<MPJLambdaWrapper<?>> consumer) {
|
||||||
|
if (data == null || field == null || oneField == null || tagField == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data instanceof IPage) {
|
||||||
|
doFill(((IPage<?>) data).getRecords(), field, oneField, tagField, consumer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data instanceof Collection) {
|
||||||
|
Collection<?> collection = (Collection<?>) data;
|
||||||
|
if (collection.isEmpty() || collection.stream().allMatch(Objects::isNull)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LambdaMeta sourceMeta = LambdaUtils.getMeta(field);
|
||||||
|
FieldCache sourceCache = MPJReflectionKit.getFieldMap(sourceMeta.getInstantiatedClass()).get(sourceMeta.getName());
|
||||||
|
|
||||||
|
LambdaMeta tagMeta = LambdaUtils.getMeta(tagField);
|
||||||
|
FieldCache tagCache = MPJReflectionKit.getFieldMap(tagMeta.getInstantiatedClass()).get(tagMeta.getName());
|
||||||
|
|
||||||
|
FieldCache oneCache;
|
||||||
|
if (oneField instanceof SF) {
|
||||||
|
SF sf = (SF) oneField;
|
||||||
|
oneCache = MPJReflectionKit.getFieldMap(sf.getClazz()).get(sf.getName());
|
||||||
|
} else {
|
||||||
|
LambdaMeta oneMeta = LambdaUtils.getMeta(oneField);
|
||||||
|
oneCache = MPJReflectionKit.getFieldMap(oneMeta.getInstantiatedClass()).get(oneMeta.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> wrapperClass = (oneField instanceof SF) ? ((SF) oneField).clazz : LambdaUtils.getEntityClass(oneField);
|
||||||
|
MPJLambdaWrapper<W> wrapper = new MPJLambdaWrapper<W>((Class<W>) wrapperClass) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R> MPJLambdaWrapper<W> in(SFunction<R, ?> column, Collection<?> coll) {
|
||||||
|
if (column instanceof SF) {
|
||||||
|
SF sf = (SF) column;
|
||||||
|
TableInfo tableInfo = TableHelper.getAssert(sf.getClazz());
|
||||||
|
return super.in(alias + StringPool.DOT + tableInfo.getKeyColumn(), coll);
|
||||||
|
}
|
||||||
|
return super.in(column, coll);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R> MPJLambdaWrapper<W> eq(SFunction<R, ?> column, Object val) {
|
||||||
|
if (column instanceof SF) {
|
||||||
|
SF sf = (SF) column;
|
||||||
|
TableInfo tableInfo = TableHelper.getAssert(sf.getClazz());
|
||||||
|
return super.eq(alias + StringPool.DOT + tableInfo.getKeyColumn(), val);
|
||||||
|
}
|
||||||
|
return super.eq(column, val);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
boolean many = Collection.class.isAssignableFrom(tagCache.getType());
|
||||||
|
|
||||||
|
if (data instanceof Collection) {
|
||||||
|
List<?> collection = ((Collection<?>) data).stream().filter(Objects::nonNull).collect(Collectors.toList());
|
||||||
|
Set<Object> sourceSet = collection.stream().map(sourceCache::getFieldValue).collect(Collectors.toSet());
|
||||||
|
if (!sourceSet.isEmpty()) {
|
||||||
|
wrapper.in(oneField, sourceSet);
|
||||||
|
if (consumer != null) {
|
||||||
|
consumer.accept(wrapper);
|
||||||
|
}
|
||||||
|
List<?> list = wrapper.list();
|
||||||
|
Map<Object, ?> map;
|
||||||
|
if (many)
|
||||||
|
map = list.stream().collect(Collectors.groupingBy(oneCache::getFieldValue));
|
||||||
|
else
|
||||||
|
map = list.stream().collect(Collectors.toMap(oneCache::getFieldValue, i -> i));
|
||||||
|
//匹配
|
||||||
|
collection.forEach(item -> tagCache.setFieldValue(item, map.get(sourceCache.getFieldValue(item))));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Object sourceVal = sourceCache.getFieldValue(data);
|
||||||
|
wrapper.eq(oneField, sourceVal);
|
||||||
|
if (consumer != null) {
|
||||||
|
consumer.accept(wrapper);
|
||||||
|
}
|
||||||
|
Object x = many ? wrapper.list(tagCache.getType()) : wrapper.one(tagCache.getType());
|
||||||
|
if (x != null) {
|
||||||
|
tagCache.setFieldValue(data, x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <X> Class<X> getTagClass(Field field) {
|
||||||
|
if (Collection.class.isAssignableFrom(field.getType())) {
|
||||||
|
return (Class<X>) MPJReflectionKit.getGenericType(field);
|
||||||
|
} else {
|
||||||
|
return (Class<X>) field.getType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
private static class SF implements SFunction<Object, Object> {
|
||||||
|
private Class<?> clazz;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object apply(Object o) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -28,6 +28,10 @@ public final class LambdaUtils {
|
|||||||
return (Class<T>) extract(fn).getInstantiatedClass();
|
return (Class<T>) extract(fn).getInstantiatedClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> LambdaMeta getMeta(SFunction<T, ?> fn) {
|
||||||
|
return extract(fn);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 该缓存可能会在任意不定的时间被清除
|
* 该缓存可能会在任意不定的时间被清除
|
||||||
*
|
*
|
||||||
@ -35,7 +39,7 @@ public final class LambdaUtils {
|
|||||||
* @param <T> 类型,被调用的 Function 对象的目标类型
|
* @param <T> 类型,被调用的 Function 对象的目标类型
|
||||||
* @return 返回解析后的结果
|
* @return 返回解析后的结果
|
||||||
*/
|
*/
|
||||||
public static <T> LambdaMeta extract(SFunction<T, ?> func) {
|
private static <T> LambdaMeta extract(SFunction<T, ?> func) {
|
||||||
// 1. IDEA 调试模式下 lambda 表达式是一个代理
|
// 1. IDEA 调试模式下 lambda 表达式是一个代理
|
||||||
if (func instanceof Proxy) {
|
if (func instanceof Proxy) {
|
||||||
return new IdeaProxyLambdaMeta((Proxy) func);
|
return new IdeaProxyLambdaMeta((Proxy) func);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.github.yulichang.toolkit.support;
|
package com.github.yulichang.toolkit.support;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@ -16,4 +17,30 @@ public class FieldCache {
|
|||||||
public Field field;
|
public Field field;
|
||||||
|
|
||||||
public Class<?> type;
|
public Class<?> type;
|
||||||
|
|
||||||
|
public boolean isAccessible = false;
|
||||||
|
|
||||||
|
public Object getFieldValue(Object object) {
|
||||||
|
try {
|
||||||
|
if (!isAccessible) {
|
||||||
|
isAccessible = true;
|
||||||
|
field.setAccessible(true);
|
||||||
|
}
|
||||||
|
return field.get(object);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw ExceptionUtils.mpe(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFieldValue(Object source, Object value) {
|
||||||
|
try {
|
||||||
|
if (!isAccessible) {
|
||||||
|
isAccessible = true;
|
||||||
|
field.setAccessible(true);
|
||||||
|
}
|
||||||
|
field.set(source, value);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw ExceptionUtils.mpe(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.github.yulichang.toolkit.support;
|
package com.github.yulichang.toolkit.support;
|
||||||
|
|
||||||
|
import org.apache.ibatis.reflection.property.PropertyNamer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lambda 信息
|
* Lambda 信息
|
||||||
* <p>
|
* <p>
|
||||||
@ -22,6 +24,10 @@ package com.github.yulichang.toolkit.support;
|
|||||||
*/
|
*/
|
||||||
public interface LambdaMeta {
|
public interface LambdaMeta {
|
||||||
|
|
||||||
|
default String getName() {
|
||||||
|
return PropertyNamer.methodToProperty(getImplMethodName());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取 lambda 表达式实现方法的名称
|
* 获取 lambda 表达式实现方法的名称
|
||||||
*
|
*
|
||||||
|
@ -253,7 +253,6 @@ public abstract class JoinAbstractLambdaWrapper<T, Children extends JoinAbstract
|
|||||||
return decode;
|
return decode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SafeVarargs
|
@SafeVarargs
|
||||||
protected final <X> String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, SFunction<X, ?>... columns) {
|
protected final <X> String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, SFunction<X, ?>... columns) {
|
||||||
|
@ -27,7 +27,7 @@ import java.util.stream.Collectors;
|
|||||||
* @author yulichang
|
* @author yulichang
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"unused", "DuplicatedCode"})
|
@SuppressWarnings({"unused", "DuplicatedCode"})
|
||||||
public class MPJLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, MPJLambdaWrapper<T>> implements
|
public class MPJLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, MPJLambdaWrapper<T>> implements Fill<MPJLambdaWrapper<T>>,
|
||||||
Query<MPJLambdaWrapper<T>>, QueryLabel<MPJLambdaWrapper<T>>, Chain<T>, SelectWrapper<T, MPJLambdaWrapper<T>> {
|
Query<MPJLambdaWrapper<T>>, QueryLabel<MPJLambdaWrapper<T>>, Chain<T>, SelectWrapper<T, MPJLambdaWrapper<T>> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -65,6 +65,8 @@ public class MPJLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, MPJLambdaW
|
|||||||
@Getter
|
@Getter
|
||||||
private Map<String, Wrapper<?>> wrapperMap;
|
private Map<String, Wrapper<?>> wrapperMap;
|
||||||
|
|
||||||
|
private List<MConsumer<Object>> fill;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 推荐使用 带 class 的构造方法
|
* 推荐使用 带 class 的构造方法
|
||||||
*/
|
*/
|
||||||
@ -282,6 +284,21 @@ public class MPJLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, MPJLambdaW
|
|||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MPJLambdaWrapper<T> addFill(MConsumer<Object> consumer) {
|
||||||
|
if (this.fill == null) {
|
||||||
|
this.fill = new ArrayList<>();
|
||||||
|
}
|
||||||
|
this.fill.add(consumer);
|
||||||
|
return typedThis;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFill(Object obj) {
|
||||||
|
if (this.fill != null) {
|
||||||
|
this.fill.forEach(c -> c.accept(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* union
|
* union
|
||||||
@ -397,5 +414,6 @@ public class MPJLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, MPJLambdaW
|
|||||||
if (Objects.nonNull(unionSql)) unionSql.toEmpty();
|
if (Objects.nonNull(unionSql)) unionSql.toEmpty();
|
||||||
resultMapMybatisLabel.clear();
|
resultMapMybatisLabel.clear();
|
||||||
ifExists = ConfigProperties.ifExists;
|
ifExists = ConfigProperties.ifExists;
|
||||||
|
fill = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.github.yulichang.wrapper.interfaces;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||||
|
import com.github.yulichang.toolkit.FillUtils;
|
||||||
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填充
|
||||||
|
*
|
||||||
|
* @auther yulichang
|
||||||
|
* @since 1.5.1
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({"unchecked", "unused", "UnusedReturnValue"})
|
||||||
|
public interface Fill<Children> {
|
||||||
|
|
||||||
|
Children addFill(MConsumer<Object> consumer);
|
||||||
|
|
||||||
|
default <R> Children fill(SFunction<R, ?> field, SFunction<R, ?> tagField) {
|
||||||
|
return addFill(c -> FillUtils.fill(c, field, tagField));
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T, X> Children fill(SFunction<T, ?> field, SFunction<T, X> tagField, MConsumer<MPJLambdaWrapper<X>> consumer) {
|
||||||
|
return addFill(c -> FillUtils.fill(c, field, tagField, (MConsumer<MPJLambdaWrapper<?>>) ((Object) consumer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T, X> Children fill(SFunction<T, ?> field, Class<X> oneClass, SFunction<T, ?> tagField) {
|
||||||
|
return addFill(c -> FillUtils.fill(c, field, oneClass, tagField));
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T, X> Children fill(SFunction<T, ?> field, Class<X> oneClass, SFunction<T, ?> tagField, MConsumer<MPJLambdaWrapper<X>> consumer) {
|
||||||
|
return addFill(c -> FillUtils.fill(c, field, oneClass, tagField, (MConsumer<MPJLambdaWrapper<?>>) ((Object) consumer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T, X> Children fill(SFunction<T, ?> field, SFunction<X, ?> oneField, SFunction<T, ?> tagField) {
|
||||||
|
return addFill(c -> FillUtils.fill(c, field, oneField, tagField));
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T, X> Children fill(SFunction<T, ?> field, SFunction<X, ?> oneField, SFunction<T, ?> tagField, MConsumer<MPJLambdaWrapper<X>> consumer) {
|
||||||
|
return addFill(c -> FillUtils.fill(c, field, oneField, tagField, (MConsumer<MPJLambdaWrapper<?>>) ((Object) consumer)));
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,7 @@ import java.util.function.BiPredicate;
|
|||||||
* on function
|
* on function
|
||||||
*
|
*
|
||||||
* @author yulichang
|
* @author yulichang
|
||||||
* @since 1.4.14
|
* @since 1.5.0
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface MBiPredicate<T, U> extends BiPredicate<T, U>, Serializable {
|
public interface MBiPredicate<T, U> extends BiPredicate<T, U>, Serializable {
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.github.yulichang.wrapper.interfaces;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializable Consumer
|
||||||
|
*
|
||||||
|
* @auther yulichang
|
||||||
|
* @since 1.5.1
|
||||||
|
*/
|
||||||
|
public interface MConsumer<T> extends Consumer<T>, Serializable {
|
||||||
|
}
|
@ -7,7 +7,7 @@ import java.util.function.Predicate;
|
|||||||
* on function
|
* on function
|
||||||
*
|
*
|
||||||
* @author yulichang
|
* @author yulichang
|
||||||
* @since 1.4.14
|
* @since 1.5.0
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface MPredicate<T> extends Predicate<T>, Serializable {
|
public interface MPredicate<T> extends Predicate<T>, Serializable {
|
||||||
|
@ -33,4 +33,7 @@ public interface SelectWrapper<Entity, Children> {
|
|||||||
PageInfo getPageInfo();
|
PageInfo getPageInfo();
|
||||||
|
|
||||||
boolean isPageByMain();
|
boolean isPageByMain();
|
||||||
|
|
||||||
|
default void doFill(Object obj) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,9 @@ public class UserDO extends ID<Integer> implements Serializable {
|
|||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private List<AddressDO> addressList;
|
private List<AddressDO> addressList;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private AddressDO address1;
|
||||||
|
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private List<AddressDO> addressList2;
|
private List<AddressDO> addressList2;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.github.yulichang.test.join.unit;
|
||||||
|
|
||||||
|
import com.github.yulichang.test.join.entity.UserDO;
|
||||||
|
import com.github.yulichang.test.util.Reset;
|
||||||
|
import com.github.yulichang.toolkit.JoinWrappers;
|
||||||
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@SuppressWarnings("OptionalGetWithoutIsPresent")
|
||||||
|
@SpringBootTest
|
||||||
|
public class FillTest {
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
Reset.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void fill() {
|
||||||
|
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class).selectAll(UserDO.class);
|
||||||
|
|
||||||
|
wrapper.fill(UserDO::getAddressId, UserDO::getAddressList);
|
||||||
|
|
||||||
|
List<UserDO> list = wrapper.clone().list();
|
||||||
|
list.forEach(System.out::println);
|
||||||
|
|
||||||
|
assert !list.stream().findFirst().get().getAddressList().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void fill1() {
|
||||||
|
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class).selectAll(UserDO.class)
|
||||||
|
.eq(UserDO::getId, 1);
|
||||||
|
|
||||||
|
|
||||||
|
wrapper.fill(UserDO::getAddressId, UserDO::getAddress1, w -> {
|
||||||
|
System.out.println(1);
|
||||||
|
// w.last("limit 1");
|
||||||
|
});
|
||||||
|
|
||||||
|
UserDO list = wrapper.clone().one();
|
||||||
|
System.out.println(list);
|
||||||
|
|
||||||
|
assert list.getAddress1() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user