#kotlin #mybatis #spring-mybatis
Вопрос:
Каков рекомендуемый подход для заполнения массива значениями из столбца в результате SQL при использовании MyBatis?
У меня есть следующий код, который работает, но мне нужно, чтобы ответ был свернут в один объект, содержащий все идентификаторы встреч.
Запись
@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 | Дата | Назначение |
---|---|---|
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"]
}
]
Комментарии:
1. Используйте
<collection>
метку. Видишь mybatis.org/mybatis-3/sqlmap-xml.html#Advanced_Result_Maps
Ответ №1:
Я решил свою проблему, создав XML-картограф, который определил collection
свойство в результирующей карте:
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>
}