我将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 <= ${r"#{rowLimit}"}
</when>
<when test="_databaseId == 'postgresql' || _databaseId == 'h2'">
LIMIT ${r"#{rowLimit}"}
</when>
</choose>
</select>
(为了简洁起见,上述代码进行了简化。)
问题是这根本不起作用,MyBatis标记被完全忽略,所有TOP和LIMIT关键字都出现在同一个SQL命令中,无论我使用什么DB方言。
在我添加Freemarker脚本之前,我不得不说它工作得非常好。这是一个bug还是一个特性?我可以让两种语言同时在一个脚本中工作吗?