我们使用的MyBatis 3.1.1。
我们发现甲骨文的结果地图返回包含大写字母列名,在MySQL的情况下,结果地图返回包含小写字母列名。
我的问题是:有什么办法可以写一些类型的拦截器,这样我可以修改结果地图返回结果。
谢谢。
我们使用的MyBatis 3.1.1。
我们发现甲骨文的结果地图返回包含大写字母列名,在MySQL的情况下,结果地图返回包含小写字母列名。
我的问题是:有什么办法可以写一些类型的拦截器,这样我可以修改结果地图返回结果。
谢谢。
恐怕答案是MyBatis的不提供控制结果地图键的情况下,任何直接的方式。 最近,我问这个问题上MyBatis的谷歌组: https://groups.google.com/forum/?fromgroups#!topic/mybatis-user/tETs_JiugNE
结果是依赖于JBDC驱动程序的行为。
这也证明,这样做列别名由@jddsantaella的建议在所有情况下无法正常工作。 我测试过的MyBatis-3.1.1三个数据库过去:MySQL,PostgreSQL和H2,得到了不同的答案。 与MySQL,列别名的情况下做决定的HashMap中的键的情况。 而在PostgreSQL它始终是小写并用H2,它始终是大写的。 我没有测试列别名是否将与甲骨文合作,但默认情况下它似乎返回大写字母。
我看到两个选项 :
选项1:创建你的代码将始终使用拉出来的数据返回地图的一些辅助方法。 例如:
private Object getFromMap(Map<String, Object> map, String key) {
if (map.containsKey(key.toLowerCase())) {
return map.get(key.toLowerCase());
} else {
return map.get(key.toUpperCase());
}
}
选项2:写LowerCaseMap类从扩展java.util.AbstractMap
或java.util.HashMap
和包装所有的呼叫, put
, putAll
和/或get
永远是小写。 然后,指定MyBatis的应使用特定LowerCaseMap而不是一个标准的HashMap,填充从查询数据时。
如果你喜欢这个想法,并希望在如何告诉MyBatis帮助如何使用不同的具体集合类,见我回答这个问题的StackOverflow: https://stackoverflow.com/a/11596014/871012
如果你修改什么查询,所以你得到你需要的正是列名? 例如:
select my_column as MY_COLUMN from ...
一个LowerCaseMap作为与resultType的观点是正确的,但你可能能够避免写你自己的。 在我的情况我使用org.apache.commons.collections.map.CaseInsensitiveMap :
<select id="getTableValues"
resultType="org.apache.commons.collections.map.CaseInsensitiveMap">
SELECT *
FROM my_table
WHERE seq_val=#{seq_val}
</select>