簡體   English   中英

mybatis 3 + spring: 我可以根據查詢結果中的列值將集合結果分為兩組嗎

[英]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>

這里我假設timeStampMetric的 ID。
如果沒有<id /> ,MyBatis 將使用timeStampdata的組合作為 ID,即使結果可能相同,效率也會降低。

如果您想要自動映射,只需將autoMapping="true"添加到結果映射。

附言
或者,也可以使用ResultHandler

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM