生成されたファイルからのMyBatis例外
質問
mybatisジェネレーター1.3.1を使用して、mapper.xmlファイルを作成しました。 MyBatisがマッパーファイルを解析すると、BuilderExceptionがスローされます。
Exception in thread "main" org.apache.ibatis.builder.BuilderException: Unknown element <#comment> in SQL statement.
at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseDynamicTags(XMLStatementBuilder.java:83)
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.binding.MapperMethod.setupCommandType(MapperMethod.java:160)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:37)
at $Proxy1.selectByExample(Unknown Source)
parsedynamictagsは<#comment>フィールドを認識していません。解析しているXMLの部分はselectbyexampleです。
<select id="selectByExample" resultMap="BaseResultMap" parameterType="test.model.TblPosStageExample" >
<!-- WARNING - @mbggenerated .. -->
select
<if test="distinct" >
distinct
</if>
<include refid="Base_Column_List" />
from tbl_Pos_Stage
<if test="_parameter != null" >
<include refid="Example_Where_Clause" />
</if>
<if test="orderByClause != null" >
order by ${orderByClause}
</if>
</select>
MyBatisは、最初のコメントとSelectステートメントを解析したようです。タイプ#textのノードを解析したばかりですが、#commentがどこから来たのかはわかりません。
私は生成されたファイルを変更していません、そして、私はこれが過去に正しく機能し、突然停止したことに困惑しています。
編集:base_column_list
<sql id="Base_Column_List" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 23 08:04:42 EST 2011.
-->
SurrogatePK, businessDate, positionId, busAIdCode, {95 columns deleted for brevity}
marketValueCcy, settledMarketValueCcy
</sql>
そして、これがexample_where_clauseです
<sql id="Example_Where_Clause" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 23 08:04:42 EST 2011.
-->
<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>
解決
私はこの問題を引き起こしたものを見つけました。 (MyBatisの生成プロセスとは何の関係もありませんでした。)
問題は、Eclipse Build Pathにユーティリティパッケージを追加したときに発生しました。問題のあるパッケージは古いorg.apache.xerces.parsersであると思います。
Eclipseプロジェクトをゼロから構築し、パッケージとコードを一度に1つずつ追加することで、エラーを見つけました。
ランタイムエラー(SQLステートメントの不明な要素<#comment>)は、プロジェクトを追加することで再現でき、ビルドパスからプロジェクトを削除することで排除できます。
他のヒント
私は標準以外のXML-Parserによって引き起こされる同じ問題を抱えていますが、それは置き換えられません。問題を開きました MyBatisの問題管理 パッチが添付されています。これがすぐに修正されることを願っています。
編集:問題がR5388で解決されました。