做的是一个分页展示,带条件查询,
//service层
@Override
@Transactional(readOnly = true)
public PageResult findAllByConditions(UserDetailsQueryDto userDetailsQueryDto) throws Exception {
QueryWrapper<UserDetailsEntity> queryWrapper = new QueryWrapper();
queryWrapper.gt(null != userDetailsQueryDto.getStartAge(), "ud.age", userDetailsQueryDto.getStartAge());
queryWrapper.gt(null != userDetailsQueryDto.getStartTime(), "ulr.login_time",userDetailsQueryDto.getStartTime());
queryWrapper.lt(null != userDetailsQueryDto.getEndAge(), "ud.age", userDetailsQueryDto.getEndAge());
queryWrapper.lt(null != userDetailsQueryDto.getEndTime(), "ulr.login_time", userDetailsQueryDto.getEndTime());
queryWrapper.eq(null != userDetailsQueryDto.getSex(), "ud.sex", userDetailsQueryDto.getSex());
//有问题的地方↓
queryWrapper.and(wrapper -> wrapper.like(!ObjectUtils.isEmpty(userDetailsQueryDto.getUserName()), "u.user_name", userDetailsQueryDto.getUserName()).or().like(!ObjectUtils.isEmpty(userDetailsQueryDto.getUserName()), "ud.nick_name", userDetailsQueryDto.getUserName()));
//有问题的地方↑
IPage<UserDetailsBo> userDetailsEntityIPage = super.getBaseMapper().findAllByConditions(new Page<UserDetailsBo>(userDetailsQueryDto.getPageNo(), userDetailsQueryDto.getPageSize()), queryWrapper);
return PageResult.pageInfo(userDetailsEntityIPage.getCurrent(), userDetailsEntityIPage.getPages(), DozerUtil.mapList(userDetailsEntityIPage.getRecords(), UserDetailsQueryDto.class));
}
//Mapper层
IPage<UserDetailsBo> findAllByConditions(Page<UserDetailsBo> userDetailsBoPage, @Param(Constants.WRAPPER) QueryWrapper<UserDetailsEntity> queryWrapper) throws DataAccessException;
//xml
<sql id="ud_column" >ud.id,ud.user_id,ud.sex,ud.age,ud.nick_name</sql>
<select id="findAllByConditions" resultType="com.dj.boot.entity.bo.UserDetailsBo">
select<include refid="ud_column"/>,u.user_name , ulr.login_time from user_details ud left join user u on ud.user_id=u.id left join user_login_record ulr on ulr.user_id=u.id
${ew.customSqlSegment}
</select>
问题出在业务层的这个条件上
queryWrapper.and(wrapper -> wrapper.like(!ObjectUtils.isEmpty(userDetailsQueryDto.getUserName()), "u.user_name", userDetailsQueryDto.getUserName()).or().like(!ObjectUtils.isEmpty(userDetailsQueryDto.getUserName()), "ud.nick_name", userDetailsQueryDto.getUserName()));
如果有条件
最开始我用 null != userDetailsQueryDto.getUserName()&&!"".equals(userDetailsQueryDto.getUserName())判断前端是否传来的字符串,但是挡不住!,
userDetailsQueryDto.getUserName()为空字符串时,还是会拼上sql ,不理解?,
然后我换成了(!ObjectUtils.isEmpty(userDetailsQueryDto.getUserName())去判断前端是否传来的字符串,但是
应该是把字符串挡住了,但明明没做条件,还是会拼上where,
在IPage那打了个断点,看了下queryWapper里的内容
无条件时,normal的size=0,cacheSqlSegment=true
正常的有条件时 normal的size有值,cacheSqlSegment=false
但是我现在的问题所遇到的情况
我知道可以把这个条件查询放在xml里去写,这样肯定可以解决问题,
但我想知道怎么在现有基础上改,以及为什么会出现这种问题,
我个人理解时 and( 字段 like ? or 字段 like ?) 这个条件拼接时有问题,但暂时get不到是哪方面
谁能解答下吗