有没有办法在基于注释的MyBatis / iBatis中重用SQL片段?

时间:2015-10-14 15:21:36

标签: java annotations mybatis ibatis

MyBatis在基于XML的定义中具有可重用SQL片段的这一强大功能,例如:

<mapper namespace="com.company.project.dao.someDao">

    <sql id="whereDate">
        WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
    </sql>  

    <sql id="someOtherSqlFragment">
        ...
    </sql>

    <select id="getSomeData"
            resultType="SomeClass"
            parameterType="DateParam" >
        SELECT some_column, another_column
    </select>

        FROM some_table

        <include refid="whereDate"/>

        <include refid="otherSqlFragment"/>

    </select>

</mapper>

有没有办法在基于注释的查询定义中定义和使用这些片段,还是没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果注释值嵌入<script> XML元素中,则可以在XML元素中使用XML元素:

@Select("<script>SELECT ...</script>")

但是使用<include>元素将触发SQL Mapper配置解析异常,原因是:

  

org.apache.ibatis.builder.BuilderException:未知元素    在SQL语句中。在   org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags

如果您查看课程nodeHandlers中的org.apache.ibatis.builder.BuilderException方法,您会注意到支持的元素是:

  • 修剪
  • ,其中
  • 设置
  • 的foreach
  • 如果
  • 选择
  • ,否则
  • 结合

然后:NO,包括基于注释的查询中的片段是不可能的。