2012-07-30 2 views
1

мы используем mybatis 3.1.1.mybatis - 3.1.1. как переопределить resultmap, возвращенный с mybatis

, который был найден для oracle, возвращаемая карта результата содержит имя столбца в прописных буквах, а в случае mySql возвращенная карта результатов содержит имя столбца небольшими буквами.

Мой вопрос: есть ли какой-либо способ, который я могу написать своего рода перехватчик, чтобы я мог изменить результат, возвращаемый результирующей картой.

Спасибо.

ответ

3

Боюсь, ответ в том, что MyBatis не обеспечивает прямой способ контролировать случай ключей в результате карте. Недавно я задал этот вопрос в группе MyBatis Google: https://groups.google.com/forum/?fromgroups#!topic/mybatis-user/tETs_JiugNE

Результат зависит от поведения драйвера JBDC.

Также выясняется, что выполнение псевдонимов столбцов, предложенное @jddsantaella, не работает во всех случаях. Я тестировал MyBatis-3.1.1 с тремя базами данных в прошлом: MySQL, PostgreSQL и H2 и получил разные ответы. С MySQL случай псевдонима столбца диктует случай ключа в hashmap. Но с PostgreSQL он всегда строчный и с H2, он всегда имеет верхний регистр. Я не тестировал, будут ли псевдонимы столбцов работать с Oracle, но по умолчанию возвращаются заглавные буквы.

Я вижу два варианта:

Вариант 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

+0

Я думал, что может быть какой-то способ изменить код API, но, наконец, я выбрал второй вариант. –

0

Что делать, если вы изменяете запрос, чтобы получить точное имя столбца, которое вам нужно? Например:

select my_column as MY_COLUMN from ... 
+0

это будет реальной утомительной задачей вручную изменить для каждого запроса. Есть много избранных запросов, запущенных с mybatis. Есть ли какой-нибудь способ, которым я могу это сделать с некоторым перехватчиком? –

+0

Я хочу быть в нижнем регистре, но в оракуле он всегда появляется в пробках –

0

Идея о 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> 
Смежные вопросы