2017-01-03 1 views
0

Ich habe folgende Tabellen:Mybatis Sammlung Eigenschaft

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 
); 

ich Benutzer mit all seinen Freunden auswählen wollen, also habe ich Mapper gemacht

<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> 

Ich habe versucht, wählen zu laufen - es ist Arbeiten ohne Probleme. Das Problem in resultMap ist

Wenn ich resultMap ohne <collection> Tag eingefügt, alles funktioniert gut und Mapper kehrt mein User-Objekt

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

Aber wenn ich einfügen <collection> Tag

<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> 

die Das Ergebnis des Mapper-Aufrufs ist null. Ich sehe keine Fehler in der Konsole. Wie kann ich Benutzer mit all seinen Freunden laden?

P. S Auch, was interessant ist, sehe ich den folgenden Text in Protokollen

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 

Soweit ich verstehe, die Auswahl funktioniert normal, aber wenn Mybatis Objekt baut, ein Problem Platz hat.

Antwort

0

Die Lösung ist ganz einfach: Ich habe diese Spalten Aliase hinzugefügt und alles begann Arbeit gut

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

Auch wenn es keine mindestens eine Eigenschaft ist, die Klasse zu kartieren - Ergebnis ist null, Wert