1. 程式人生 > >mybatis萬用字元引用報錯的問題XML fragments parsed from previous mappers does not contain value

mybatis萬用字元引用報錯的問題XML fragments parsed from previous mappers does not contain value

寫mapper A的時候,發現內容太長,於是把被引用的refid單獨抽出來成為一個新的mapper檔案,A中只保留了直接對外的介面申請了,於是就有了mapper B 檔案。

在A檔案裡面引用B的sql,如:

    <include refid="B.where_1" />

結果報錯:

org.apache.ibatis.builder.IncompleteElementException: Could not find SQL statement to include with refid 'A.where_2'
at org.apache.ibatis.builder.xml.XMLIncludeTransformer.findSqlFragment(XMLIncludeTransformer.java:104)
at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:64)
at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:87)
at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:75)
at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:87)
at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:48)
at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:88)
at org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:760)

Caused by: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for A.where_2
at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:860)
at org.apache.ibatis.builder.xml.XMLIncludeTransformer.findSqlFragment(XMLIncludeTransformer.java:101)
... 69 more

後來發現 B檔案中B.where_1引用了<include refid="where_2" />,原來是在引用的時候沒有加字首,改成<include refid="B.where_2" />這樣就可以了.

最終是這樣的:

A檔案:

    <select id="getCount" resultMap="BaseResultMap">
        select count(*)
        from X a

    <include refid="B.where_1" />

</select>   

B檔案:

<sql id="where_1">
where a.id =#{id,jdbcType=VARCHAR}

     <include refid="B.where_2" />     

</sql>

<sql id="where_2">

a.name =#{name,jdbcType=VARCHAR}

</sql>

B檔案最開始where_1中引用where_2時沒有加B.的字首,所有報錯了。原來where_1在引入到A檔案後,直接把where_2也引用過去了,然後相當於是A檔案引用的where_2.