mybatis3.1.1を使用しています。
oracleの場合、返される結果マップには大文字の列名が含まれ、mySqlの場合、返される結果マップには小文字の列名が含まれることがわかりました。
私の質問は次のとおりです。結果マップによって返される結果を変更できるように、ある種のインターセプターを作成する方法はありますか。
ありがとう。
申し訳ありませんが、MyBatis は結果マップのキーの大文字と小文字を制御する直接的な方法を提供していません。最近、MyBatis Google グループでこの質問をしました: https://groups.google.com/forum/?fromgroups#!topic/mybatis-user/tETs_JiugNE
結果は、JBDC ドライバーの動作に依存します。
また、@jddsantaella が提案するように列のエイリアシングを実行しても、すべての場合に機能するとは限りません。過去に、MyBatis-3.1.1 を 3 つのデータベース (MySQL、PostgreSQL、および H2) でテストしましたが、異なる回答が得られました。MySQL では、カラム エイリアスの大文字と小文字がハッシュマップのキーの大文字と小文字を区別します。ただし、PostgreSQL では常に小文字であり、H2 では常に大文字です。列のエイリアスが Oracle で機能するかどうかはテストしていませんが、デフォルトでは大文字が返されるようです。
2 つのオプションが表示されます。
オプション 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:java.util.AbstractMap
orから拡張された LowerCaseMap クラスを作成し、へのjava.util.HashMap
すべての呼び出しをラッパーput
、putAll
および/またはget
常に小文字にする。次に、クエリからデータを入力するときに、MyBatis が標準の HashMap ではなく特定の LowerCaseMap を使用するように指定します。
このアイデアが好きで、MyBatis に別の具体的なコレクション クラスを使用する方法を教えてほしい場合は、この StackOverflow の質問に対する私の回答を参照してください: https://stackoverflow.com/a/11596014/871012
クエリを変更して、必要な列名を正確に取得するとどうなるでしょうか? 例えば:
select my_column as MY_COLUMN from ...
ResultType として LowerCaseMap を使用するという考えは適切ですが、おそらく独自のものを作成することは避けることができます。私の場合、org.apache.commons.collections4.map.CaseInsensitiveMapを使用しています:
<select id="getTableValues"
resultType="org.apache.commons.collections.map.CaseInsensitiveMap">
SELECT *
FROM my_table
WHERE seq_val=#{seq_val}
</select>