2017-01-03 3 views
0

私は、次の表ていますMyBatisのコレクションプロパティ

CREATE TABLE users (
    id VARCHAR (255) NOT NULL, 
    name VARCHAR (255) NOT NULL, 
    create_date TIMESTAMP NOT NULL, 
    email VARCHAR (255) NOT NULL, 
    password VARCHAR (255) NOT NULL, 
    last_visit TIMESTAMP, 
    avatar_id VARCHAR (255) 
); 

CREATE TABLE user_friends (
    user_id VARCHAR (255) NOT NULL, 
    friend_id VARCHAR (255) NOT NULL 
); 

CREATE TABLE file (
    id VARCHAR (255) NOT NULL, 
    file_path VARCHAR (255) NOT NULL, 
    create_date TIMESTAMP NOT NULL, 
    user_id VARCHAR (255) NOT NULL 
); 

私は選択を実行しようとした私はすべての彼の友人を持つユーザーを選択したいので、私はマッパー

<sql id="coreUserAttributes"> 
     users.id, 
     users.name, 
     users.last_visit as lastVisit 
</sql> 

<select id="getUser" resultMap="UserRM"> 
    SELECT 
    <include refid="coreUserAttributes"/>, 
    f.id as friendId, 
    f.name as friendName 
    FROM users 
    LEFT JOIN user_friends ON users.id = user_friends.user_id 
    LEFT JOIN users f ON f.id = user_friends.friend_id 
    <where> 
     users.id = #{id} 
    </where> 
</select> 

作りました - それはです問題なく動作します。 問題は、私は<collection>タグなしでこのresultMapを挿入すると、すべてがうまく を働いているとマッパーは、私のユーザーオブジェクト

<resultMap id="UserRM" type="User"> 
    <id column="id"/> 
</resultMap> 

を返しresultmapに

であるしかし、私は<collection>タグ

<resultMap id="UserRM" type="User"> 
    <id column="id"/> 
    <collection property="friends" ofType="User" javaType="ArrayList"> 
     <id column="friendId"/> 
     <result column="friendName" property="name"/> 
    </collection> 
</resultMap> 

挿入したときマッパー呼び出しの結果はnullです。私はコンソールにエラーは表示されません。 ユーザーをすべての友人と一緒に読み込むにはどうすればよいですか?

P.S また、興味深いのは何か、私はログ

2017-01-03 22:29:19 DEBUG u.s.network.query.UserMapper.getUser - ==> Preparing: SELECT users.id, users.name, users.last_visit as lastVisit , f.id as friendId, f.name as friendName FROM users LEFT JOIN user_friends ON users.id = user_friends.user_id LEFT JOIN users f ON f.id = user_friends.friend_id WHERE users.id = ? 
2017-01-03 22:29:19 DEBUG u.s.network.query.UserMapper.getUser - ==> Preparing: SELECT users.id, users.name, users.last_visit as lastVisit , f.id as friendId, f.name as friendName FROM users LEFT JOIN user_friends ON users.id = user_friends.user_id LEFT JOIN users f ON f.id = user_friends.friend_id WHERE users.id = ? 
2017-01-03 22:29:19 DEBUG u.s.network.query.UserMapper.getUser - ==> Parameters: 1(String) 
2017-01-03 22:29:19 DEBUG u.s.network.query.UserMapper.getUser - ==> Parameters: 1(String) 
2017-01-03 22:29:19 DEBUG u.s.network.query.UserMapper.getUser - <==  Total: 1 
2017-01-03 22:29:19 DEBUG u.s.network.query.UserMapper.getUser - <==  Total: 1 

MyBatisのは、オブジェクトが作成されるときに限り、私は理解して、選択した作品は通常、しかし、いくつかの問題が発生している

に次のテキストを参照してください。

答えて

0

ソリューションは非常に簡単です:私は、この列にエイリアスを追加しましたし、自分のクラスにマップするために何の少なくとも1つの性質があればすべては、

<sql id="coreUserAttributes"> 
     users.id AS id, 
     users.name AS name, 
     users.last_visit as lastVisit 
</sql> 

また作業ウェルを開始していない - 結果はnullになります値