1 <select id="sltTreatment" resultType="com.vitaminmd.sunny.core.bo.Treatment"> 2 select * 3 from treatment 4 where TRUE 5 <if test="index == 'A'"> 6 AND ensubject IS NOT NULL AND ensubject <> '' 7 </if> 8 </select>
當使用的index為A時,這段便拋出一個NumberFormatExeption的異常,但是如果index為一個數值比如1時就運行正常。
錯誤
Caused by: java.lang.NumberFormatException: For input string: "A" at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) at java.lang.Double.parseDouble(Unknown Source) at org.apache.ibatis.ognl.OgnlOps.doubleValue(OgnlOps.java:248) at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:137) at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:178) at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:548) at org.apache.ibatis.ognl.ASTEq.getValueBody(ASTEq.java:49) at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:175) at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:213) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:314) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:394) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:435) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:414) at org.apache.ibatis.builder.xml.dynamic.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:17) at org.apache.ibatis.builder.xml.dynamic.IfSqlNode.apply(IfSqlNode.java:15) at org.apache.ibatis.builder.xml.dynamic.MixedSqlNode.apply(MixedSqlNode.java:14) at org.apache.ibatis.builder.xml.dynamic.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:22) at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:198) at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:115) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:90) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:72) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:75)
解決方案:
1.改為:test="param eq 'A'.toString()"
2.原因是OGNL語法的問題:
這里 'A' 將被認為是 char 類型,但是 'AA' 或者 "A" 將被作為 String類型。
所以我們可以用轉義:<if test="name == "A"">
3.或者將 <if test="index == 'A'"> 改為 <if test='index == "A"'>。