【问题标题】:Populating an array in the results object with MyBatis使用 MyBatis 在结果对象中填充数组
【发布时间】:2021-05-18 13:13:54
【问题描述】:

在使用 MyBatis 时,使用 SQL 结果中的列中的值填充数组的推荐方法是什么?

我有以下代码正在运行,但我需要将响应折叠到包含所有约会 ID 的单个对象中。

记录

@Serializable
data class SiteSchedule(
    val id: String,
    @Serializable(with = LocalDateSerializer::class) val date: LocalDate,
    val appointmentId: String
)

映射器

@Mapper
interface SiteScheduleMapper {

  @Select(
      """
      select schedule.id, schedule.date, appointment.id
      from schedule, appointment
      where schedule.date = #{date}
      and appointment.schedule_id = schedule.id
      and appointment.status = 'S'
      """)
  fun findSchedule(
      @Param("date") date: LocalDate
  ): Array<SiteSchedule>
}

SQL查询结果

id date appointmentId
1 2021-07-01 100
1 2021-07-01 200
1 2021-07-01 300
1 2021-07-01 400

当前 API 响应

[
  {
    "id": "1",
    "dateTime": "2021-07-01",
    "appointmentId": "100"
  },
  {
    "id": "1",
    "dateTime": "2021-07-01",
    "appointmentId": "200"
  },
  {
    "id": "1",
    "dateTime": "2021-07-01",
    "appointmentId": "300"
  },
  {
    "id": "1",
    "date": "2021-07-01",
    "appointmentId": "400"
  }
]

所需的 API 响应

[
  {
    "id": "1",
    "date": "2021-07-01",
    "appointmentIds": ["100","200","300","400"]
  }
]

【问题讨论】:

标签: kotlin mybatis spring-mybatis


【解决方案1】:

我通过创建一个在结果映射中定义 collection 属性的 XML 映射器解决了我的问题:

SiteScheduleMapper.xml

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.domain.mappers.SiteScheduleMapper">
    <resultMap id="siteScheduleResultMap" type="com.domain.SiteSchedule">
        <id column="sch_id" property="scheduleId" />
        <result column="appt_dt" property="date" />
        <collection property="appointmentIds" ofType="String">
            <result column="appt_id" />
        </collection>
    </resultMap>
</mapper>

记录

@Serializable
data class SiteSchedule
constructor(
    val id: String? = "",
    @Serializable(with = LocalDateSerializer::class) val date: LocalDate? = null,
    val appointmentIds: MutableList<String>? = mutableListOf()
)

映射器界面

@Mapper
interface SiteScheduleMapper {

  @Select(
      """
      select schedule.id, schedule.date, appointment.id
      from schedule, appointment
      where schedule.date = #{date}
      and appointment.schedule_id = schedule.id
      and appointment.status = 'S'
      """)
  @ResultMap("siteScheduleResultMap")
  fun findSchedule(
      @Param("date") date: LocalDate
  ): Array<SiteSchedule>
}

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2019-08-04
    • 2018-11-14
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多