0

我有 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列将上述查询结果分为两组,将划分的集合分别复制到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"
            }
        ]
    }
]

感谢任何想法/语法,谢谢!

4

1 回答 1

0

可能无法将单个列的结果分成两个列表。

为了得到你想要的结果,你需要对结果集中的数据进行分离。
它有点冗长,但您可以使用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      |  
+-------+-----------------------------+----------+-----------------------------+------------+  

您要映射到up列表的数据位于带有up_前缀的列中。
也是如此down

关于结果映射,应该有两个<collection />s,因为 中有两个列表属性DeviceType
在这种情况下,最好定义另一个结果映射Metric并重新使用它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是 的 ID Metric
如果没有<id />,MyBatis 将使用 和 的组合timeStamp作为dataID,即使结果可能相同,效率也会降低。

如果您想要自动映射,只需添加autoMapping="true"到结果映射中。

ps
或者,也可以使用ResultHandler.

于 2020-10-08T16:52:30.263 回答