MyBatis 集合 属性
MyBatis collection property
我有以下表格:
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
);
我想 select 用户和他所有的朋友,所以我制作了 mapper
<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>
我已经尝试 运行 select - 它没有任何问题。
问题出在 ResultMap
如果我插入没有 <collection>
标签的 resultMap,一切正常
和映射器 returns 我的用户对象
<resultMap id="UserRM" type="User">
<id column="id"/>
</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>
映射器调用的结果为空。我在控制台中没有看到任何错误。
如何加载用户及其所有朋友?
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
据我了解,select正常,但是在mybatis构建对象时,出现了一些问题。
解决方案非常简单:我已将别名添加到此列,一切都开始正常工作
<sql id="coreUserAttributes">
users.id AS id,
users.name AS name,
users.last_visit as lastVisit
</sql>
此外,如果没有至少一个 属性 映射到您的 class - 结果将为空值
我有以下表格:
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
);
我想 select 用户和他所有的朋友,所以我制作了 mapper
<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>
我已经尝试 运行 select - 它没有任何问题。 问题出在 ResultMap
如果我插入没有 <collection>
标签的 resultMap,一切正常
和映射器 returns 我的用户对象
<resultMap id="UserRM" type="User">
<id column="id"/>
</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>
映射器调用的结果为空。我在控制台中没有看到任何错误。 如何加载用户及其所有朋友?
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
据我了解,select正常,但是在mybatis构建对象时,出现了一些问题。
解决方案非常简单:我已将别名添加到此列,一切都开始正常工作
<sql id="coreUserAttributes">
users.id AS id,
users.name AS name,
users.last_visit as lastVisit
</sql>
此外,如果没有至少一个 属性 映射到您的 class - 结果将为空值