String columnsToString(X... columns) {
+ return Arrays.stream(columns).map(this::columnToString).collect(joining(StringPool.COMMA));
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ public Children clone() {
+ return SerializationUtils.clone(typedThis);
+ }
+}
diff --git a/src/main/java/com/github/yulichang/common/JoinLambdaWrapper.java b/src/main/java/com/github/yulichang/common/JoinLambdaWrapper.java
new file mode 100644
index 0000000..924eb04
--- /dev/null
+++ b/src/main/java/com/github/yulichang/common/JoinLambdaWrapper.java
@@ -0,0 +1,130 @@
+package com.github.yulichang.common;
+
+import com.baomidou.mybatisplus.core.conditions.SharedString;
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 自定义连表sql
+ *
+ * 不使用表别名:
+ *
+ * //注解
+ * @Select("select user.*,user_address.tel from user left join user_address on user.id = user_address.user_id ${ew.customSqlSegment}")
+ *
+ * //或者xml
+ *
+ * select user.*, user_address.tel
+ * from user left join user_address on user.id = user_address.user_id
+ * ${ew.customSqlSegment}
+ *
+ *
+ * //mapper
+ * UserDTO userLeftJoin(@Param(Constants.WRAPPER) Wrapper queryWrapper);
+ *
+ * wrapper使用方法:
+ * UserDTO userDTO = userMapper.userLeftJoin(new JoinLambdaWrapper()
+ * .eq(UserDO::getId, "1")
+ * .eq(UserAddressDO::getUserId, "1"));
+ *
+ * 对应生成sql:
+ * select user.*, user_address.tel
+ * from user left join user_address on user.id = user_address.user_id
+ * WHERE (
+ * user.id = ?
+ * AND user_address.user_id = ?)
+ *
+ *
+ * 使用别名:
+ *
+ *
+ * //注解
+ * @Select("select u.*,ua.tel from user u left join user_address ua on u.id = ua.user_id ${ew.customSqlSegment}")
+ *
+ * //或者xml
+ *
+ * select u.*, ua.tel
+ * from user u left join user_address ua on u.id = ua.user_id
+ * ${ew.customSqlSegment}
+ *
+ *
+ * //mapper
+ * UserDTO userLeftJoin(@Param(Constants.WRAPPER) Wrapper queryWrapper);
+ *
+ * wrapper使用方法:
+ * UserDTO userDTO = userMapper.userLeftJoin(new JoinLambdaWrapper()
+ * .alias(UserDO.class, "u") //如果sql使用别名,需要再此定义别名
+ * .alias(UserAddressDO.class, "ua") //如果sql使用别名,需要再此定义别名
+ * .eq(UserDO::getId, "1")
+ * .eq(UserAddressDO::getUserId, "1"));
+ *
+ * 对应生成sql:
+ * select u.*, ua.tel
+ * from user u left join user_address ua on u.id = ua.user_id
+ * WHERE (
+ * u.id = ?
+ * AND ua.user_id = ?)
+ *
+ *
+ * 如需单独使用只需拷贝以下类
+ * {@link com.github.yulichang.common.JoinLambdaWrapper}
+ * {@link com.github.yulichang.common.JoinAbstractWrapper}
+ * {@link com.github.yulichang.common.JoinAbstractLambdaWrapper}
+ * {@link com.github.yulichang.wrapper.interfaces.Compare}
+ * {@link com.github.yulichang.wrapper.interfaces.Func}
+ *
+ *
+ * @author yulichang
+ * @since 1.0.9
+ */
+public class JoinLambdaWrapper extends JoinAbstractLambdaWrapper> {
+
+ /**
+ * 实体与别名对应关系
+ */
+ public JoinLambdaWrapper alias(Class> clazz, String alisa) {
+ subTable.put(clazz, alisa);
+ return typedThis;
+ }
+
+
+ public JoinLambdaWrapper() {
+ super.initNeed();
+ }
+
+ /**
+ * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(...)
+ */
+ JoinLambdaWrapper(T entity, Class entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq,
+ Map paramNameValuePairs, MergeSegments mergeSegments,
+ SharedString lastSql, SharedString sqlComment, SharedString sqlFirst) {
+ super.setEntity(entity);
+ super.setEntityClass(entityClass);
+ this.paramNameSeq = paramNameSeq;
+ this.paramNameValuePairs = paramNameValuePairs;
+ this.expression = mergeSegments;
+
+ this.lastSql = lastSql;
+ this.sqlComment = sqlComment;
+ this.sqlFirst = sqlFirst;
+ }
+
+
+ /**
+ * 用于生成嵌套 sql
+ * 故 sqlSelect 不向下传递
+ */
+ @Override
+ protected JoinLambdaWrapper instance() {
+ return new JoinLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs,
+ new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString());
+ }
+
+ @Override
+ public void clear() {
+ super.clear();
+ }
+}
+
diff --git a/src/main/java/com/github/yulichang/common/README.md b/src/main/java/com/github/yulichang/common/README.md
new file mode 100644
index 0000000..c86e8f1
--- /dev/null
+++ b/src/main/java/com/github/yulichang/common/README.md
@@ -0,0 +1,122 @@
+## 连表通用wrapper
+
+### 使用方法
+
+#### 不使用表别名
+
+注解:
+
+```java
+
+@Mapper
+public interface UserMapper extends BaseMapper {
+
+ @Select("select user.*,user_address.tel from user left join user_address on user.id = user_address.user_id ${ew.customSqlSegment}")
+ UserDTO userLeftJoin(@Param(Constants.WRAPPER) Wrapper> queryWrapper);
+}
+```
+
+或者xml
+
+```
+
+
+ select
+ user.*,
+ user_address.tel
+ from
+ user
+ left join user_address on user.id = user_address.user_id
+ ${ew.customSqlSegment}
+
+```
+
+使用wrapper:
+
+```java
+class MpJoinTest {
+ @Resource
+ private UserMapper userMapper;
+
+ @Test
+ void test() {
+ UserDTO userDTO = userMapper.userLeftJoin(new JoinLambdaWrapper<>()
+ .eq(UserDO::getId, "1")
+ .eq(UserAddressDO::getUserId, "1"));
+ }
+}
+```
+
+对应sql:
+
+```
+select
+ user.*,
+ user_address.tel
+from
+ user
+ left join user_address on user.id = user_address.user_id
+WHERE (
+ user.id = ?
+ AND user_address.user_id = ?)
+```
+
+#### 使用表别名
+
+注解:
+
+```java
+
+@Mapper
+public interface UserMapper extends BaseMapper {
+
+ @Select("select u.*,ua.tel from user u left join user_address ua on u.id = ua.user_id ${ew.customSqlSegment}")
+ UserDTO userLeftJoin(@Param(Constants.WRAPPER) Wrapper> queryWrapper);
+}
+```
+
+或者xml
+
+```
+
+ select
+ u.*,
+ ua.tel
+ from
+ user u
+ left join user_address ua on u.id = ua.user_id
+ ${ew.customSqlSegment}
+
+```
+
+使用wrapper:
+
+```java
+class MpJoinTest {
+ @Resource
+ private UserMapper userMapper;
+
+ @Test
+ void test() {
+ UserDTO userDTO = userMapper.userLeftJoin(new JoinLambdaWrapper<>()
+ .alias(UserDO.class, "u") //如果使用别名需要再此声明别名与实体的对应关系
+ .alias(UserAddressDO.class, "ua") //如果使用别名需要再此声明别名与实体的对应关系
+ .eq(UserDO::getId, "1")
+ .eq(UserAddressDO::getUserId, "1"));
+ }
+}
+```
+
+对应sql:
+
+```
+select
+ u.*,
+ ua.tel
+from
+ user u
+ left join user_address ua on u.id = ua.user_id
+WHERE (
+ u.id = ?
+ AND ua.user_id = ?)
+```
\ No newline at end of file
diff --git a/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java b/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java
index e806fff..caffc5a 100644
--- a/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java
+++ b/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
import org.apache.ibatis.reflection.property.PropertyNamer;
-import java.lang.reflect.Field;
import java.util.Objects;
/**
@@ -29,13 +28,11 @@ public final class LambdaUtils {
* 优先获取tableField中的值
*/
public static String getColumn(SFunction fn) {
-
SerializedLambda lambda = com.baomidou.mybatisplus.core.toolkit.LambdaUtils.resolve(fn);
String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName());
try {
- Field field = lambda.getImplClass().getDeclaredField(fieldName);
- TableField annotation = field.getAnnotation(TableField.class);
- if (Objects.nonNull(annotation)) {
+ TableField annotation = lambda.getImplClass().getDeclaredField(fieldName).getAnnotation(TableField.class);
+ if (Objects.nonNull(annotation) && StringUtils.isNotBlank(annotation.value())) {
return annotation.value();
}
} catch (NoSuchFieldException ignored) {