你的分享就是我们的动力 ---﹥

Mybatis mapper方法中包含多个参数,且其中包含*Example类型的参

时间:2013-05-06 17:25来源:www.chengxuyuans.com 点击:
最近需要用Mybatis做一个分页显示的功能,想在mapper提供一个方法接口
selectPageByExample(@Param("example")Example e,@Param("beginLine")Integer beginLine, @Param("endLine")Integer endLine)


这样就需要在mapper.xml中定义该方法接口对应的sql语句
<select id="selectByExample" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    <include refid="Base_Column_List" />
    from client
    <if test="example!= null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
      limit #{beginLine},#{endLine}
  </select>


执行过程中,显示在使用example的时候,里面的criteria为null。
具体为:
org.mybatis.spring.MyBatisSystemException: SqlSession operation; nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.mapping.SqlMapperException: The expression 'oredCriteria' evaluated to a null value.
### The error may exist in com/alex/server/mapper/ClientMapper.xml
### The error may involve com.alex.server.mapper.ClientMapper.selectPageByExample
### The error occurred while executing a query
### Cause: org.apache.ibatis.mapping.SqlMapperException: The expression 'oredCriteria' evaluated to a null value.


首先多个参数的值已经取到了,可以读取出来。
其中问题主要出现在:
<if test="example!= null">
      <include refid="Example_Where_Clause" />
</if>

一旦example不为null的时候,就会去调用Example_Where_Clause sql子句。

该子句语法如下:
<sql id="Example_Where_Clause">
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <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 close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>

大体意思就是根据example的criteria来组装这个where子句,其并未指定应用哪个example,我想是其框架默认使用传进来的example参数。但是当多参数传进来的时候,貌似就取不到example里面的criteria,但是能知道example不是null。这里有点奇怪。

不知道有没有人遇到过这种情况。
求解啊。

当然分页还有很多其他方式,如果哪位大虾有较好的方案,也可以顺便点拨一下。

谢谢

转载注明地址:http://www.chengxuyuans.com/ibatis/58653.html

推荐文章