0 0

mybatis的mapper文件不能使用sql标签定义的语句10

Struts2 + spring2.5 + Mabatis3.04
很奇怪,程序里面用了<sql/>标签定义的公共语句<commonColumns 和 dynamicWhere>,不能应用,只要引用就报找不到,而用实际的代码替换,即不用引入方式,就正确.按mybatis的官方说法,是可以使用的啊.

备注:--这个错误不是因为commonColumns 或 dynamicWhere中些的有问题引起的,


错误信息如下:
### Error updating database.  Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
### The error may exist in D:\DevEnv\IDE\eclipse-jee-galileo-SR2-win32\WorkSpaces\Test_App\WebRoot\WEB-INF\classes\com\demo\userinfo\model\mapper\UserInfoMapper.xml
### Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
	at com.demo.exception.Exceptions.createAppException(Exceptions.java:65)
	at com.demo.ibatis3.SqlSessionTemplate.execute(SqlSessionTemplate.java:62)
	at com.demo.ibatis3.SqlSessionTemplate.insert(SqlSessionTemplate.java:182)
	at com.demo.ibatis3.IBatis3Dao.insert(IBatis3Dao.java:105)
	at com.demo.service.ServiceBase.insert(EntityServiceBase.java:70)
	at com.demo.dao.impl.UserInfoServiceTest.test(UserInfoServiceTest.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
	at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
	at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
### The error may exist in D:\DevEnv\IDE\eclipse-jee-galileo-SR2-win32\WorkSpaces\Test_App\WebRoot\WEB-INF\classes\com\demo\userinfo\model\mapper\UserInfoMapper.xml
### Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:120)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:107)
	at com.cqt.framework.orm.ibatis3.SqlSessionTemplate$10.doInSession(SqlSessionTemplate.java:186)
	at com.cqt.framework.orm.ibatis3.SqlSessionTemplate.execute(SqlSessionTemplate.java:57)
	... 27 more
Caused by: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
	at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:593)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder$IncludeNodeHandler.handleNode(XMLStatementBuilder.java:155)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseDynamicTags(XMLStatementBuilder.java:85)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:43)
	at org.apache.ibatis.session.Configuration.parseStatementNodes(Configuration.java:513)
	at org.apache.ibatis.session.Configuration.buildStatementsForNamespace(Configuration.java:502)
	at org.apache.ibatis.session.Configuration.buildStatementsFromId(Configuration.java:467)
	at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:391)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:117)
	... 30 more




myBatis的sql映射文件:
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="UserInfo">
   <resultMap id="UserInfoResult" type="com.demo.userinfo.model.UserInfo">
      <result column="user_id" jdbcType="VARCHAR" property="userId" />
      <result column="username" jdbcType="VARCHAR" property="username" />
      <result column="password" jdbcType="VARCHAR" property="password" />
   </resultMap>
  
   <!-- 语句中不能通过<include refid="xx" />方式引用 commonColumns 和 dynamicWhere-->
   <sql id="commonColumns">
      <![CDATA[ user_id, username, password ]]>
   </sql>

   <sql id="dynamicWhere">
      <where>
	 <if test="@O@isNotEmpty(id)">
	     AND ID = #{id}
	 </if>
	 <if test="@O@isNotEmpty(userName)">
	     AND userName = #{userName}
	 </if>
	 <if test="@O@isNotEmpty(password)">
	    AND password = #{password}
	 </if>
       </where>
   </sql>

   <update id="update" parameterType="com.demo.userinfo.model.UserInfo"> UPDATE user_info
	<set>
	    <if test="username != null">username = #{username} ,</if>
	    <if test="password != null">password = #{password}</if>
	</set>
        WHERE
	user_id = #{userId}
   </update>

    <!-- 错误***** 只要采用Include方式引用公共的commonColumns和dynamicWhere就报错 ****** -->
    <select id="findById" parameterType="string" resultMap="UserInfoResult">
	select
	<include refid="commonColumns" />
        <![CDATA[ from user_info where user_id = #{userId} ]]>
    </select>


    <!-- 正确***** 只要采用Include方式引用公共的commonColumns和dynamicWhere就报错 ****** -->
    <select id="findById" parameterType="string" resultMap="UserInfoResult">
	select
	user_id, username, password
        <![CDATA[ from user_info where user_id = #{userId} ]]>
    </select>

    
    <!-- 错误***** 只要采用Include方式引用公共的commonColumns和dynamicWhere就报错 ****** -->
    <select id="findByConditions" resultMap="UserInfoResult" parameterType="com.demo.page">
	select
        <include refid="commonColumns" />
	from user_info
        where
        <include refid="dynamicWhere" />
    </select>

    <!-- 正确***** 只要不采用Include方式引用公共的commonColumns和dynamicWhere就正确 ****** -->
    <select id="findByConditions" resultMap="UserInfoResult" parameterType="com.demo.page">
	select
        user_id, username, password
	from user_info
        where 1= 1
      <where>
	 <if test="@O@isNotEmpty(id)">
	     AND ID = #{id}
	 </if>
	 <if test="@O@isNotEmpty(userName)">
	     AND userName = #{userName}
	 </if>
	 <if test="@O@isNotEmpty(password)">
	    AND password = #{password}
	 </if>
       </where>
    </select>
</mapper>

问题补充
而且,我debug跟踪进去,发现在内存中加载的mapper配置文件信息中,确实没有看到<sql/>标签定义的commonColumns和dynamicWhere,值看到了<update>,<select>等

问题补充:<div class="quote_title">hudingchen 写道</div><div class="quote_div">为什么要加&lt;![CDATA[?</div> <br /> <br />其实这跟&lt;![CDATA[? 没有任何关系, <br />因为这个标签只是告诉编译器,里面的数据原样解析,而且如果没有这个标签,则如果里面有一些特殊符号,比如小于好&lt;,可能就会有问题。 <br /> <br />当然,在例子中的&lt;![CDATA[标签,确实是多余,可以不用,因为里面不涉及到任何由歧义的计算符号或表示符,但是有没有不影响。 <br /> <br />不过还是谢谢你的回答!

问题补充:<div class="quote_title">shansun123 写道</div><div class="quote_div">这个有点纠结啊,运行时错误? <br />直接Debug好了,看看UserInfo.commonColumns这个东东到底有没加载 <br />没用过ibatis3,仅供参考啦。</div> <br /><div class="quote_title">shansun123 写道</div><div class="quote_div">这个有点纠结啊,运行时错误? <br />直接Debug好了,看看UserInfo.commonColumns这个东东到底有没加载 <br />没用过ibatis3,仅供参考啦。</div> <br /> <br /> <br />前面说了,debug的时候的,没有看到用&lt;sql/&gt;定义的东西,但是应用里确有: <br />下面是我debug的信息: <br /> SqlSession session = null; <br />session.configuration.statementNodesToParse对象里的数据如下: <br /><pre name="code" class="java">
{UserInfo=[
&lt;insert parameterType="com.cqt.demo.userinfo.model.UserInfo" id="insert"&gt;&lt;/insert&gt;,
&lt;update parameterType="com.cqt.demo.userinfo.model.UserInfo" id="update"&gt;
&lt;set&gt;
&lt;if test="username != null"&gt;username = #{username} ,&lt;/if&gt;
&lt;if test="password != null"&gt;password = #{password}&lt;/if&gt;
&lt;/set&gt;
&lt;/update&gt;,
&lt;delete parameterType="com.cqt.demo.userinfo.model.UserInfo" id="delete"&gt;&lt;/delete&gt;,
&lt;delete parameterType="string" id="deleteById"&gt;&lt;/delete&gt;,
&lt;select resultMap="UserInfoResult" parameterType="string" id="findById"&gt;
&lt;include refid="commonColumns"/&gt;
&lt;/select&gt;,
&lt;select resultMap="UserInfoResult" parameterType="com.cqt.framework.page.PageContext" id="findPage"&gt;
&lt;include refid="commonColumns"/&gt;
&lt;/select&gt;
  ]
}
</pre> <br />

问题补充:注意,不用考虑userInfo类的路径问题,呵呵 <br />因为一不小心,忘记更改报名了,以为发问题帖和发行帖一样,可以时候修改的,结果发现不能修改。呵呵
2011年5月10日 16:22

6个答案 按时间排序 按投票排序

0 0

jar升级就好了,升到mybatis-spring-1.1.1.jar mybatis-3.1.1.jar就可以了

2015年1月14日 18:50
0 0

这个问题有解决方案了吗?

2013年7月09日 23:41
0 0

namespace的值应该有问题。
include其他mapper文件的sql时,使用namespace全名

2012年5月28日 16:10
0 0

HI,我下午搭了个iBatis3的环境,用了下sql标签,是正常的啊

<sql id="commonColumns">  
  id, user_id, service_id, content, file_url, status, gmt_create, gmt_modified
</sql>  

<!-- 执行频率:10000次/天,作用:根据用户编号查询服务协议 -->
<select id="getProtocolByUserId" parameterType="Long"
	resultMap="ibatorgenerated_BaseResultMap">
	select <include refid="commonColumns"/>
	from test_protocol where user_id=#userId# and
	status = 1 order by
	gmt_create desc 
</select>

是不是问题出在别处了

2011年5月13日 15:51
0 0

这个有点纠结啊,运行时错误?
直接Debug好了,看看UserInfo.commonColumns这个东东到底有没加载
没用过ibatis3,仅供参考啦。

2011年5月12日 21:26
0 0

为什么要加<![CDATA[?

2011年5月10日 17:18

相关推荐

Global site tag (gtag.js) - Google Analytics