81,122
社区成员




<sql id="Example_Where_Clause" >
<where >
<foreach collection="oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
<trim prefix="(" suffix=")" prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion" >
<choose >
<when test="criterion.noValue" >
and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue" >
and ${criterion.condition}
<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
生成的clear方法只是将查询条件的list调用了jdk底层的clear方法,没有涉及到sqlsession。
public void clear() {
oredCriteria.clear(); //这里是查询条件List的clear()
orderByClause = null;
distinct = false;
}
我用了你的代码做了测试,如果不去调用clear方法,连续两笔不同的入参确实会出问题,但日志中的sql是不一样的,而不是没有第二条的sql日志
问题出在那个or()上面,查询条件这个列表oredCriteria会存在上一笔的查询条件,并且是或者的关系,也就是会多查出来,最后又通过get(0)列表只取一笔,导致总是查询出列表中的第一个。
2021-03-05 12:46:05.468 DEBUG 28636 --- [nio-8080-exec-1] o.o.m.mapper.UserMapper.selectByExample : ==> Preparing: select id, name from user WHERE ( id = ? )
2021-03-05 12:46:05.488 DEBUG 28636 --- [nio-8080-exec-1] o.o.m.mapper.UserMapper.selectByExample : ==> Parameters: 1(Long)
2021-03-05 12:46:05.505 DEBUG 28636 --- [nio-8080-exec-1] o.o.m.mapper.UserMapper.selectByExample : <== Total: 1
[org.outerwaterfire.mybatis_test.po.User@21e9cb2e]
2021-03-05 12:52:40.804 DEBUG 28636 --- [nio-8080-exec-2] o.o.m.mapper.UserMapper.selectByExample : ==> Preparing: select id, name from user WHERE ( id = ? ) or( id = ? )
2021-03-05 12:52:40.804 DEBUG 28636 --- [nio-8080-exec-2] o.o.m.mapper.UserMapper.selectByExample : ==> Parameters: 1(Long), 2(Long)
2021-03-05 12:52:40.900 DEBUG 28636 --- [nio-8080-exec-2] o.o.m.mapper.UserMapper.selectByExample : <== Total: 2