代码之家  ›  专栏  ›  技术社区  ›  Petr Sládek

MyBatis在Freemarker内有效吗?

  •  1
  • Petr Sládek  · 技术社区  · 6 年前

    我将MyBatis配置为使用Freemarker,如下所示:

        <setting name="defaultScriptingLanguage" value="FreeMarker"/>
    </settings>
    <typeAliases>
        <typeAlias type="org.mybatis.scripting.freemarker.FreeMarkerLanguageDriver" alias="FreeMarker"/>
    </typeAliases>
    

    然后我在MyBatis中有一个select,我需要将其转换为Freemarker:

    <select id="find" parameterType="map" resultType="com.example.MyType">
        SELECT
            <if test="_databaseId == 'sqlserver'">
                TOP (${r"#{rowLimit}"})
            </if>
        FROM myexampletable
        <choose>
            <when test="_databaseId == 'oracle'">
                WHERE rownum &lt;= ${r"#{rowLimit}"}
            </when>
            <when test="_databaseId == 'postgresql' || _databaseId == 'h2'">
                LIMIT ${r"#{rowLimit}"}
            </when>
        </choose>
    </select>
    

    (为了简洁起见,上述代码进行了简化。)

    问题是这根本不起作用,MyBatis标记被完全忽略,所有TOP和LIMIT关键字都出现在同一个SQL命令中,无论我使用什么DB方言。

    在我添加Freemarker脚本之前,我不得不说它工作得非常好。这是一个bug还是一个特性?我可以让两种语言同时在一个脚本中工作吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Petr Sládek    6 年前

    因此,我创建了一个github问题来解决这个谜团,答案很有帮助,但却是否定的:

    不,不能在同一语句中同时使用XML和Freemaker语法。

    您可以在以下版本中阅读我们的完整评论:

    https://github.com/mybatis/freemarker-scripting/issues/33