[英]mybatis 3 + spring : Can I put a collection result into two groups based on a column value from the query result
我有一個 2 java 這樣的模型
public class DeviceData {
private String name;
private List<Metric> up;
private List<Metric> down;
}
public class Metric{
private Long data;
private LocalDateTime timeStamp;
}
實際查詢從 db 中按名稱獲取結果,列名如下所示。
-------------------------------------------------------------
data | timestamp | name | trafficType
-------------------------------------------------------------
10 | 2020-10-08 13:10:00 | test1 | down
20 | 2020-10-08 12:15:00 | test1 | up
30 | 2020-10-08 13:10:00 | test2 | down
40 | 2020-10-08 12:15:00 | test2 | up
不行,我一直在嘗試讓mybatis xml根據列trafficType up, down將上面的查詢結果分成兩組,分別復制分集到class DeviceData.java的up列表,down列表。 我嘗試使用鑒別器,但似乎沒有用,因為我需要這兩種情況。
到目前為止 resultMap 是這樣的.. (基本)
<resultMap id="trafficData" type="DeviceData" autoMapping="true">
<id property="name" column="name" jdbcType="VARCHAR"/>
<collection property="upload" ofType="Metric" autoMapping="true">
</collection>
</resultMap>
試圖實現這個 JSON 響應:
[
{
"name": "test1",
"down": [
{
"data": 10,
"timeStamp": "2020-10-08 13:10:00"
}
],
"up": [
{
"data": 20,
"timeStamp": "2020-10-08 12:15:00"
}
]
},
{
"name": "test2,
"down": [
{
"data": 30,
"timeStamp": "2020-10-08 13:10:00"
}
],
"up": [
{
"data": 40,
"timeStamp": "2020-10-08 12:15:00"
}
]
}
]
感謝任何想法/語法,謝謝!
可能無法將單個列的結果分成兩個列表。
要獲得你想要的結果,你需要將結果集中的數據分開。
它有點冗長,但您可以使用CASE
表達式,例如。
select
name,
case traffic_type
when 'up' then ts
else null
end as up_timeStamp,
case traffic_type
when 'up' then data
else null
end as up_data,
case traffic_type
when 'down' then ts
else null
end as down_timeStamp,
case traffic_type
when 'down' then data
else null
end as down_data
from device_data
使用您問題中的示例數據,結果如下所示。
+-------+-----------------------------+----------+-----------------------------+------------+
| NAME | UP_TIMESTAMP | UP_DATA | DOWN_TIMESTAMP | DOWN_DATA |
+-------+-----------------------------+----------+-----------------------------+------------+
| test1 | null | null | 2020-10-08 13:10:00.000000 | 10 |
| test1 | 2020-10-08 12:15:00.000000 | 20 | null | null |
| test2 | null | null | 2020-10-08 13:10:00.000000 | 30 |
| test2 | 2020-10-08 12:15:00.000000 | 40 | null | null |
+-------+-----------------------------+----------+-----------------------------+------------+
您要 map 到up
列表的數據位於帶有up_
前綴的列中。
down
也是如此。
關於結果 map,應該有兩個<collection />
因為DeviceType
中有兩個列表屬性。
在這種情況下,最好為Metric
定義另一個結果 map 並與columnPrefix
一起重新使用它。
<resultMap id="trafficData" type="test.DeviceData">
<id property="name" column="name" />
<collection property="up"
resultMap="metric" columnPrefix="up_" />
<collection property="down"
resultMap="metric" columnPrefix="down_" />
</resultMap>
<resultMap id="metric" type="test.Metric">
<id property="timeStamp" column="timeStamp" />
<result property="data" column="data" />
</resultMap>
這里我假設timeStamp
是Metric
的 ID。
如果沒有<id />
,MyBatis 將使用timeStamp
和data
的組合作為 ID,即使結果可能相同,效率也會降低。
如果您想要自動映射,只需將autoMapping="true"
添加到結果映射。
附言
或者,也可以使用ResultHandler
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.