29485


MyBatisでARAAY型の値が取得できません。  
Tomcatを起動した時点で、以下のようなエラーが発生してしまいます。

[MyBatisのリファレンス](http://www.mybatis.org/mybatis-3/ja/sqlmap-
xml.html#Result_Maps)の「サポートされている JDBC データ型」には  
ARRAYの記載があるので対応しているとは思うのですが。  
ご知識のある方、お教示お願いいたします。

【Tomcat起動時エラー】

[code]

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'receiveMapper' defined in file [D:\apache-tomcat-8.0.14\wtpwebapps\MamaFriends\WEB-INF\classes\com\hatak\mamafriends\mapper\logic\receive\ReceiveMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.hatak.mamafriends.mapper.logic.receive.ReceiveMapper.messagesResultMap
    （以下略）
    
[/code]

【XML】

[code]

    <resultMap id="messagesBirthdayResultMap"  type="getMessagesBirthdayEntity">
        <id     property="uid"         column="uid"        jdbcType="VARCHAR" />
        <result property="birthdays"   column="birthdays"  jdbcType="ARRAY" />
    </resultMap>
    
    <select id="getMessagesBirthday" parameterType="GetMessagesBirthdayEntity" resultMap="messagesBirthdayResultMap">
        SELECT
            m.id AS uid
            ,ARRAY(SELECT c.birthday FROM children c WHERE m.from_uid = c.uid) AS birthdays
        FROM messages m
        ORDER BY m.created DESC
        OFFSET #{offset}
        LIMIT #{limit}
        ;
    </select>
    
[/code]

【Entity】

[code]

    public class GetMessagesBirthdayEntity {
    
        private String uid = "";
        private Date[] birthdays = null;
    
        public String getUid() {
            return uid;
        }
    
        public void setUid(String uid) {
            this.uid = uid;
        }
    
        public Date[] getBirthdays() {
            return birthdays;
        }
    
        public void setBirthdays(Date[] birthdays) {
            this.birthdays = birthdays;
        }
    }
    
[/code]

【ミドルウェアバージョン】  
MyBatis：3.2.8  
PosrgreSQL：9.5.3


CC BY-SA 3.0
2016-10-10T16:10:56.813
29467
2016-10-11T17:04:57.053
9581
question
java spring postgresql
MyBatisでPostgreSQLのARRAY型が取得できない


MyBatis で JDBC ↔ Java の型変換を行うのは TypeHandler です。  
TypeHandler は基本的に `javaType` と `jdbcType` の組み合わせで登録および検索されますが、`ARRAY` の変換を行う
ArrayTypeHandler はデフォルトだと `java.lang.Object` と `ARRAY`
の組み合わせに対してのみ登録されているようです。

なので、以下のいずれかの方法で `birthdays` のマッピングに ArrayTypeHandler が使われるように指示する必要があります。

  1. MyBatis の設定ファイルで `java.util.Date[]` と `ARRAY` の組み合わせに対して ArrayTypeHandler を登録する（`date[]` はエイリアス）。
[code]     <typeHandlers>

      <typeHandler handler="org.apache.ibatis.type.ArrayTypeHandler"
        javaType="date[]" jdbcType="ARRAY" />
    </typeHandlers>
    
[/code]

  2. `result` 要素に対して `typeHandler` を明示的に指定する。
[code]     <result property="birthdays" column="birthdays"

      typeHandler="org.apache.ibatis.type.ArrayTypeHandler" />
    
[/code]


CC BY-SA 3.0
2016-10-11T17:04:57.053
29485
2016-10-11T17:04:57.053
19103
29467
answer