当前位置: 首页 > 知识库问答 >
问题:

Mybatis3+spring:我可以根据查询结果中的列值将集合结果分成两组吗

越学文
2023-03-14
public class DeviceData {
    private String name;
    private List<Metric> up;
    private List<Metric> down;
}
public class Metric{
    private Long data;
    private LocalDateTime timeStamp;
}
-------------------------------------------------------------
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
<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"
            }
        ]
    }
]

欣赏任何想法/语法,谢谢!

共有1个答案

袁弘方
2023-03-14

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

要获得您想要的结果,您需要分离结果集中的数据。
这有点冗长,但您可以使用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      |  
+-------+-----------------------------+----------+-----------------------------+------------+  
<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>
 类似资料:
  • 问题内容: 1个 结果集 : 2个 结果集2: 有没有办法可以做到这一点: 我想在RHEL 5上使用Sybase 12.5的解决方案,我也想知道在其他任何数据库系统中是否可行。 -–谢谢您的回答- 问题答案: 通过为该列使用CASE / WHEN并基于true / false求和1或0,您可以在同一查询中获得这两者。此外,如果您希望将另一个值的总和作为另一个,则可以执行相同的操作列…只需将其替换为

  • 问题内容: 我正在使用PHP和PDO从数据库检索一组值,然后使用以下代码按第一列进行分组: 这意味着如果我的数据采用以下格式: 它返回为: 我将如何按Column1和Column2分组,这样我会得到以下信息: 可以结合使用PDO常数吗? 谢谢 问题答案: 如您所见,通过将数组与一个指定的列进行分组,可以轻松地轻松重建数组。您需要将二维数组(数据库的结果)转换为三维数组,但是 无法 以这种方式重建它

  • 问题内容: 查询1: 查询2: 我想将两个结果合并为两列,其中缺少一列=查询2-查询1以加快处理速度。我该怎么做?示例: 我有两个结果: // ----------------------------------------查询:1 1 2 3 4 // --------------------------------------查询:2 4 5 6 8 // ------------------

  • 问题内容: 我有一个这样的表: 我想将连续序列号分组为一行,如下所示: 请帮助实现此结果。 问题答案:

  • 我获得的结果集有时包含属性的负值,需要将其替换为0。 是否可以使用ad-hoc查询替换这些值,或者我需要在从我的JPA方法获得结果集后替换它们?

  • 有几种不同方法可以生成查询结果: 结果数组 结果行 自定义结果对象 结果辅助方法 Class Reference 结果数组 result() 方法 该方法以**对象数组**形式返回查询结果,如果查询失败返回**空数组**。 一般情况下,你会像下面这样在一个 foreach 循环中使用它: $query = $this->db->query("YOUR QUERY"); foreach ($que