使用mybatis的一個坑
剛剛在使用mybatis寫sql,一開始我定義了一個介面:
List<Video> getVideosByCondition(@Param("keyword") String keyword, @Param("status") List<String> status, @Param("deptId") Integer deptId, @Param("userId") String userId, @Param("categoryId") Integer categoryId, @Param("isDeleted") String isDeleted, @Param("index") Integer index, @Param("size") Integer size);
然後xml的寫法:
<select id="getVideosByCondition" resultType="com.ovp.domain.Video"> select * from video where 1=1 <if test="keyword != null and keyword.length()>0"> and ( title like CONCAT('%', #{keyword,jdbcType=VARCHAR}, '%' ) or tag1 like CONCAT('%', #{keyword,jdbcType=VARCHAR}, '%' ) or videoId = #{keyword,jdbcType=VARCHAR} ) </if> <if test="status != null and status.size()>0"> and status in <foreach item="item" collection="status" separator="," open="(" close=")" index="index"> #{item,jdbcType=VARCHAR} </foreach> </if> <if test="deptId != null "> and deptId=#{deptId,jdbcType=INTEGER} </if> <if test="userId != null and userId.length()>0"> and userId = #{userId,jdbcType=VARCHAR} </if> <if test="categoryId != null"> and categoryId=#{categoryId,jdbcType=INTEGER} </if> <if test="isDeleted != null and isDeleted.length()>0"> and deleted=#{isDeleted,jdbcType=VARCHAR} </if> order by createdTime DESC <if test="index!=null and size!=null"> limit #{index,jdbcType=INTEGER}, #{size,jdbcType=INTEGER} </if> </select>
介面傳遞的index和size分別是分頁的引數。
然後查詢結果一直有誤,傳遞的引數也一直查不出問題。後來列印了輸出的sql,發現,index的值一直是1。。。
排查來排查去,最後覺得是xml的問題。終於發現foreach裡也有index。
而且當我的status的值是null時,查詢沒有任何問題。測試了一下發現了原因
我在使用foreach的時候,由於元素有2個,所以index是從0到1賦值,也就是說最後一個迴圈,index的值時1,
到了下面的limit語句,index其實是複用了上面的變數,所以值仍然是1。所以就一直有問題。。。。
最後我換了index變數為其他值。問題解決。