2021-02-22 15:54:42 +08:00

3.7 KiB

连表通用wrapper

官方自定义sql

官方提供的自定义sql不支持表别名和多实体泛型,扩展能力有限,对此就行了优化

使用方法

如需单独使用 请拷贝以下6个类

com.github.yulichang.common.JoinLambdaWrapper
com.github.yulichang.common.JoinAbstractWrapper
com.github.yulichang.common.JoinAbstractLambdaWrapper
com.github.yulichang.wrapper.interfaces.Compare
com.github.yulichang.wrapper.interfaces.Func
com.github.yulichang.toolkit.LambdaUtils

不使用表别名

注解:


@Mapper
public interface UserMapper extends BaseMapper<UserDO> {

    @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 id="userLeftJoin" resultType="UserDTO">
    select 
        user.*, 
        user_address.tel
    from 
        user 
        left join user_address on user.id = user_address.user_id
    ${ew.customSqlSegment}
</select>

使用wrapper:

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 = ?)

使用表别名

注解:


@Mapper
public interface UserMapper extends BaseMapper<UserDO> {

    @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 id="userLeftJoin" resultType="UserDTO">
    select 
        u.*, 
        ua.tel
    from 
        user u
        left join user_address ua on u.id = ua.user_id
    ${ew.customSqlSegment}
</select>

使用wrapper:

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 = ?)

QQ群:1022221898