论坛首页 Java企业应用论坛

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

浏览 20469 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-04-22  
最近需要用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。这里有点奇怪。

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

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

谢谢
   发表时间:2012-04-22  
补充一点,如果传进去的example参数为null,是可以实现分页的。
所以问题肯定是example上。

简而言之,就是example不为null的时候,在生成where子句的时候,发现里面的criteria为null
0 请登录后投票
   发表时间:2012-12-11  
这样改改

<if test="_parameter != null" >
  <include refid="Example_Where_Clause_ex" />  
      </if>


  <sql id="Example_Where_Clause_ex" >
    <where >
      <foreach collection="example.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>








<select id="selectByExample" resultMap="BaseResultMap">  
    select  
    <if test="distinct">  
      distinct  
    </if>  
    <include refid="Base_Column_List" />  
    from client  
     <if test="_parameter != null" >
  <include refid="Example_Where_Clause_ex" />  
      </if>    <if test="orderByClause != null">  
      order by ${orderByClause}  
    </if>  
      limit #{beginLine},#{endLine}  
  </select>
0 请登录后投票
   发表时间:2012-12-11  
  <select id="selectByExample" resultMap="BaseResultMap" parameterType="map">  
    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> 
0 请登录后投票
   发表时间:2012-12-11  
或者 引用 这个 Update_By_Example_Where_Clause
0 请登录后投票
   发表时间:2012-12-11  
<select id="selectByExample" resultMap="BaseResultMap" parameterType="map">  
    select  
    <if test="distinct">  
      distinct  
    </if>  
    <include refid="Base_Column_List" />  
    from client  
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />  
    </if>  
    <if test="orderByClause != null">  
      order by ${orderByClause}  
    </if>  
      limit #{beginLine},#{endLine}  
  </select> 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics