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

标签 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>

有没有一种方法可以在查询的基于注释的定义中定义和使用此类片段,或者对于这个查询是否没有绕过 XML 的方法?

最佳答案

如果嵌入在 <script> 中,您可以在注释值中使用用于动态 SQL 的 XML 元素XML 元素:

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

但使用 <include>元素将触发 SQL 映射器配置解析异常,由以下原因引起:

org.apache.ibatis.builder.BuilderException: Unknown element in SQL statement. at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags

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

  • 修剪
  • 在哪里
  • 设置
  • foreach
  • 如果
  • 选择
  • 什么时候
  • 否则
  • 绑定(bind)

那么:不,在基于注释的查询中包含片段是不可能的。

关于java - 有没有办法在基于注解的 MyBatis/iBatis 中重用 SQL 片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33129344/

相关文章:

java - 是否可以将方法参数传递给方法上的注释?

java - Netbeans javac 在 LayerGenerateProcessor 中为 @Override 抛出异常。问题出在哪里?

hibernate - 忽略Hibernate @Where批注

java - 如何在servlet中使用或调用java类并将结果显示到jsp

java - 验证正则表达式返回 false

java - ADF JDeveloper 11g 中的“inputFile”组件问题

java - [SQL]如何在一个 SELECT 中填充具有另一个表列表的对象?

java - BitmapFactory : Unable to decode stream: java. io.FileNotFoundException 即使文件实际上存在

java - 获取mybatis最后插入记录的id

java - 准备好的语句需要重新准备