首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mybatis映射JSON_ARRAYAGG结果

如何使用mybatis映射JSON_ARRAYAGG结果
EN

Stack Overflow用户
提问于 2021-01-05 17:28:51
回答 2查看 138关注 0票数 0

我无法映射来自JSON_ARRAYAGG function的结果。

mybatis mapper:

代码语言:javascript
复制
<mapper namespace="com.test.mapper.UserEntityMapper">
    <resultMap id="userMap" type="UserVO">
        <id property="id" column="id" />
        <result property="username" column="username"/>
        <collection property="pictures" ofType="PictureVO">
            <id property="id" column="id" />
            <result property="location" column="location" />
        </collection>
    </resultMap>
    <select id="findUserById" parameterType="map" resultMap="userMap">
        SELECT
        users.id,
        users.username,
        JSON_ARRAYAGG(
            JSON_OBJECT(
                "id",
                pic.id,
                "location",
                pic.location
            ) 
        ) AS pictures
        FROM
            users
            LEFT JOIN pictures pic ON users.id = pic.user_id 
        WHERE
            users.id = 1
    </select>
</mapper>

UserVO型号:

代码语言:javascript
复制
@Getter
@Setter
@NoArgsConstructor
public class UserVO {
    private Long id;
    private String username;
    private List<PictureVO> pictures;
}

PictureVO型号:

代码语言:javascript
复制
@Getter
@Setter
@NoArgsConstructor
public class PictureVO {
    private Long id;
    private String location;
}

调用API的结果如下:

代码语言:javascript
复制
{
    "id": 1,
    "username": "connor",
    "pictures": [
        {
            "id": 1,
            "location": null
        }
    ]
}

如您所见,只有id才能正确映射pictures。假设在pictures中有2个结果,如果我直接执行sql,这里只返回1个结果。

EN

回答 2

Stack Overflow用户

发布于 2021-01-05 19:01:21

你应该设置你的方法的("findUserById")返回类型列表,MyBatis会自动完成。尝试在mapper接口中编写它:

代码语言:javascript
复制
List<UserVo> findUserById();
票数 0
EN

Stack Overflow用户

发布于 2021-01-06 06:27:43

MyBatis返回的是Java对象,而不是JSON,所以可能是您的'API‘将Java对象转换为JSON。

如果我是对的,你只需要做正常的MyBatis映射。

如下所示:

代码语言:javascript
复制
<resultMap id="userMap" type="UserVO">
  <id property="id" column="id" />
  <result property="username" column="username"/>
  <collection property="pictures" ofType="PictureVO">
    <id property="id" column="picture_id" />
    <result property="location" column="location" />
  </collection>
</resultMap>

<select id="findUserById" parameterType="map" resultMap="userMap">
  SELECT
    users.id,
    users.username,
    pic.id picture_id,
    pic.location
  FROM
    users
    LEFT JOIN pictures pic ON users.id = pic.user_id
  WHERE
    users.id = 1
</select>

请注意,pic.id需要一个别名来区分结果集中的列和users.id

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65576227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档