fix select子查询参数问题

This commit is contained in:
yulichang 2023-10-23 00:15:25 +08:00
parent fcfbef0139
commit 468a28f836
5 changed files with 752 additions and 618 deletions

View File

@ -12,7 +12,6 @@ import com.github.yulichang.toolkit.KtUtils;
import com.github.yulichang.toolkit.KtWrapperUtils; import com.github.yulichang.toolkit.KtWrapperUtils;
import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.TableList;
import com.github.yulichang.toolkit.support.ColumnCache; import com.github.yulichang.toolkit.support.ColumnCache;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.github.yulichang.wrapper.interfaces.Chain; import com.github.yulichang.wrapper.interfaces.Chain;
import com.github.yulichang.wrapper.interfaces.SelectWrapper; import com.github.yulichang.wrapper.interfaces.SelectWrapper;
import com.github.yulichang.wrapper.resultmap.Label; import com.github.yulichang.wrapper.resultmap.Label;
@ -218,8 +217,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
wrapper.subTableAlias = st; wrapper.subTableAlias = st;
consumer.accept(wrapper); consumer.accept(wrapper);
addCustomWrapper(wrapper); addCustomWrapper(wrapper);
String sql = KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName()); this.selectColumns.add(new SelectSub(() -> KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName()), hasAlias, this.alias));
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
return typedThis; return typedThis;
} }

View File

@ -217,8 +217,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
wrapper.subTableAlias = st; wrapper.subTableAlias = st;
consumer.accept(wrapper); consumer.accept(wrapper);
addCustomWrapper(wrapper); addCustomWrapper(wrapper);
String sql = WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias)); this.selectColumns.add(new SelectSub(() -> WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias)), hasAlias, this.alias));
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
return typedThis; return typedThis;
} }

View File

@ -0,0 +1,125 @@
package com.github.yulichang.wrapper.segments;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.github.yulichang.wrapper.enums.BaseFuncEnum;
import org.apache.ibatis.type.TypeHandler;
import java.util.Objects;
import java.util.function.Supplier;
/**
* 子查询列
*
* @author yulichang
* @since 1.4.7
*/
public class SelectSub implements Select {
private final Supplier<String> column;
private final boolean hasTableAlias;
private final String tableAlias;
public SelectSub(Supplier<String> column, boolean hasTableAlias, String tableAlias) {
this.column = column;
this.hasTableAlias = hasTableAlias;
this.tableAlias = tableAlias;
}
@Override
public Class<?> getClazz() {
return null;
}
@Override
public Integer getIndex() {
return null;
}
@Override
public boolean isHasTableAlias() {
return this.hasTableAlias;
}
@Override
public String getTableAlias() {
return this.tableAlias;
}
@Override
public boolean isPk() {
return false;
}
@Override
public String getColumn() {
return Objects.isNull(column) ? StringPool.EMPTY : column.get();
}
@Override
public Class<?> getColumnType() {
return null;
}
@Override
public String getTagColumn() {
return null;
}
@Override
public String getColumProperty() {
return null;
}
@Override
public boolean hasTypeHandle() {
return false;
}
@Override
public TypeHandler<?> getTypeHandle() {
return null;
}
@Override
public boolean isHasAlias() {
return false;
}
@Override
public String getAlias() {
return null;
}
@Override
public TableFieldInfo getTableFieldInfo() {
return null;
}
@Override
public boolean isFunc() {
return false;
}
@Override
public SelectFunc.Arg[] getArgs() {
return null;
}
@Override
public BaseFuncEnum getFunc() {
return null;
}
@Override
public boolean isLabel() {
return false;
}
@Override
public boolean isStr() {
return true;
}
}

View File

@ -1047,10 +1047,10 @@ class LambdaWrapperTest {
.le(UserDO::getId, 100); .le(UserDO::getId, 100);
wrapper.list(); wrapper.list();
ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); ThreadLocalUtils.set("SELECT ( SELECT st.id FROM area st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)");
MPJLambdaWrapper<UserDO> wrapper1 = JoinWrappers.lambda(UserDO.class) MPJLambdaWrapper<UserDO> wrapper1 = JoinWrappers.lambda(UserDO.class)
.selectSub(AddressDO.class, w -> w.select(AddressDO::getId) .selectSub(AreaDO.class, w -> w.select(AreaDO::getId)
.eq(AddressDO::getId, UserDO::getId) .eq(AreaDO::getId, AddressDO::getId)
.last("limit 1"), UserDO::getId) .last("limit 1"), UserDO::getId)
.leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)
.le(UserDO::getId, 100); .le(UserDO::getId, 100);

View File

@ -190,6 +190,7 @@ class LambdaWrapperTest {
/** /**
* 基本数据类型测试 * 基本数据类型测试
*/ */
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
@Test @Test
fun testWrapper() { fun testWrapper() {
ThreadLocalUtils.set( ThreadLocalUtils.set(
@ -756,7 +757,7 @@ class LambdaWrapperTest {
.leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id)
try { try {
val dos: List<UserDO> = userMapper!!.selectJoinList(UserDO::class.java, wrapper) userMapper!!.selectJoinList(UserDO::class.java, wrapper)
} catch (_: BadSqlGrammarException) { } catch (_: BadSqlGrammarException) {
} }
} }
@ -792,13 +793,13 @@ class LambdaWrapperTest {
val wrapper: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java) val wrapper: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id)
.leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId)
val integer: Long = userMapper!!.selectCount(wrapper) userMapper!!.selectCount(wrapper)
ThreadLocalUtils.set("SELECT COUNT( * ) FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false") ThreadLocalUtils.set("SELECT COUNT( * ) FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false")
val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java) val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id)
.leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId)
val aLong1: Long = userMapper.selectJoinCount(wrapper1) userMapper.selectJoinCount(wrapper1)
} }
@ -819,7 +820,7 @@ class LambdaWrapperTest {
.orderByDesc(UserDO::id) .orderByDesc(UserDO::id)
.setTableName { name -> name + "bbbbbbb" } .setTableName { name -> name + "bbbbbbb" }
try { try {
val list = userMapper!!.selectJoinList(UserDTO::class.java, wrapper) userMapper!!.selectJoinList(UserDTO::class.java, wrapper)
} catch (_: BadSqlGrammarException) { } catch (_: BadSqlGrammarException) {
} }
} }
@ -966,7 +967,7 @@ class LambdaWrapperTest {
.leftJoin(UserDO::class.java, UserDO::addressId, AddressDO::id) .leftJoin(UserDO::class.java, UserDO::addressId, AddressDO::id)
.leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id)
val addressDOS: List<AddressDO> = wrapper.list() wrapper.list()
} }
/** /**
@ -980,7 +981,7 @@ class LambdaWrapperTest {
.leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id)
.eq(AddressDO::id, AddressDO::id) .eq(AddressDO::id, AddressDO::id)
val addressDOS: List<UserDO> = wrapper.list() wrapper.list()
} }
/** /**
@ -995,7 +996,7 @@ class LambdaWrapperTest {
ext.eq(AddressDO::id, AddressDO::id) ext.eq(AddressDO::id, AddressDO::id)
} }
.eq(AddressDO::id, AddressDO::id) .eq(AddressDO::id, AddressDO::id)
val addressDOS: List<UserDO> = wrapper.list() wrapper.list()
} }
/** /**
@ -1008,7 +1009,7 @@ class LambdaWrapperTest {
"SELECT id,user_id,name FROM order_t t ORDER BY t.name desc" "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc"
) )
val wrapper: KtLambdaWrapper<OrderDO> = KtWrappers.query(OrderDO::class.java) val wrapper: KtLambdaWrapper<OrderDO> = KtWrappers.query(OrderDO::class.java)
val list: List<OrderDO> = wrapper.list() wrapper.list()
ThreadLocalUtils.set( ThreadLocalUtils.set(
"SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC", "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC",
@ -1019,7 +1020,7 @@ class LambdaWrapperTest {
.selectAs(UserDO::name, OrderDO::userName) .selectAs(UserDO::name, OrderDO::userName)
.leftJoin(UserDO::class.java, UserDO::id, OrderDO::userId) .leftJoin(UserDO::class.java, UserDO::id, OrderDO::userId)
println(wrapper.from) println(wrapper.from)
val l: List<OrderDO> = w.list() w.list()
} }
/** /**
@ -1075,7 +1076,7 @@ class LambdaWrapperTest {
.leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id)
.eq(OrderDO::id, 1) .eq(OrderDO::id, 1)
try { try {
val join = userMapper!!.updateJoin(user1, update) userMapper!!.updateJoin(user1, update)
} catch (_: BadSqlGrammarException) { } catch (_: BadSqlGrammarException) {
//忽略异常 h2不支持连表删除 //忽略异常 h2不支持连表删除
} }
@ -1110,16 +1111,27 @@ class LambdaWrapperTest {
.le(UserDO::id, 100) .le(UserDO::id, 100)
wrapper.list() wrapper.list()
ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") ThreadLocalUtils.set("SELECT ( SELECT st.id FROM area st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)")
val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java) val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.selectSub(AddressDO::class.java, { w -> .selectSub(AreaDO::class.java, { w ->
w.select(AddressDO::id) w.select(AreaDO::id)
.eq(AddressDO::id, UserDO::id) .eq(AreaDO::id, AddressDO::id)
.last("limit 1") .last("limit 1")
}, UserDO::id) }, UserDO::id)
.leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id)
.le(UserDO::id, 100) .le(UserDO::id, 100)
wrapper1.list() wrapper1.list()
ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)")
val wrapper2: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.selectSub(AddressDO::class.java, { w ->
w.select(AddressDO::id)
.eq(AddressDO::id, AddressDO::id)
.last("limit 1")
}, UserDO::id)
.leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id)
.le(UserDO::id, 100)
wrapper2.list()
} }