在 MyBatis Plus 中进行嵌套查询时,子查询中的参数可以通过以下几种方式传递:
一、使用字符串拼接
可以直接在子查询的 SQL 语句中进行字符串拼接来传递参数。
例如:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsersByCondition(int minAge) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
String subQuery = "(select id from user where age > " + minAge + " group by id having sum(age) > 100)";
queryWrapper.inSql("id", subQuery);
return userMapper.selectList(queryWrapper);
}
}
这种方式比较简单直接,但可能存在 SQL 注入的风险,需要谨慎使用,并且不太适合复杂的参数传递情况。
二、使用占位符和参数对象
- 在子查询的 SQL 中使用占位符,然后通过
QueryWrapper
的apply
方法传入参数。
例如:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsersByCondition(int minAge) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.inSql("id", "(select id from user where age >? group by id having sum(age) > 100)", minAge);
return userMapper.selectList(queryWrapper);
}
}
这种方式相对安全,可以有效防止 SQL 注入,并且可以灵活地传递多个参数。
- 如果使用
LambdaQueryWrapper
,可以在 lambda 表达式中构建子查询时使用占位符,并在apply
方法中传入参数。
例如:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsersByCondition(int minAge) {
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(User::getId, () -> {
LambdaQueryWrapper<User> subQueryWrapper = new LambdaQueryWrapper<>();
subQueryWrapper.select(User::getId).groupBy(User::getId).having("sum(age) >?", 100 + minAge);
return userMapper.selectObjs(subQueryWrapper);
});
return userMapper.selectList(lambdaQueryWrapper);
}
}
这种方式同样可以安全地传递参数,并且结合 lambda 表达式使得代码更加简洁易读。