【问题标题】:Apache Camel: How to transform hierarchical data from database into pojoApache Camel:如何将分层数据从数据库转换为 pojo
【发布时间】:2020-11-10 19:05:04
【问题描述】:

我是 stackoverflow 和 Apache Camel 的新手。我试着写一个可以理解的描述我的问题。

我的目标是从数据库 (mysql) 中读取分层数据,该数据库由父表中的 1 个条目和子表中的几行组成,并将这些数据转换为 pojo。 子目标:不写太多自定义代码,使用蓝图xml。

由于我找不到适合此问题的 EIP,我在此列出我目前的方法:

1.通过连接查询选择数据

select * from parentTable join childTable on childTable.parentId=parentTable.id

这意味着编写一个自定义处理器将结果转换为 pojo,因为每次父属性都会为每个结果行获取选择结果。由于我尽量避免编写自定义处理器,因此我尝试了以下方法:

2。选择查询返回具有正确结构的 JSON 以转换为 pojo

select json_object(
      'parentProperty1', parentProperty1
    , 'parentProperty2', parentProperty2
    , 'children', (select CAST(CONCAT('[',
                GROUP_CONCAT(
                  JSON_OBJECT(  
                          'childProperty1', childProperty1
                        , 'childProperty2', childProperty2
                        )),
                ']')
         AS JSON) 
        from childTable c
        where p.messageId=c.messageId
        )
    ))  
from parentTable p
;

在 mysql shell 上执行查询返回预期的 JSON:

{
    "parentProperty1": "value1",
    "parentProperty1": "value2",
    "children": [
        {
            "childProperty1": "value3",
            "childProperty2": "value4"
        },
        {
            "childProperty1": "value5",
            "childProperty2": "value6"
        }
    ]
}

在camel里面运行查询,遇到了一个问题,目前还没有找到解释和解决方案。

主体在查询执行后具有 JSON,但它被初始查询的片段包围:

[{json_object('parentProperty1', parentProperty1 , 'parentProperty2', parentProperty2 , 'children', (select CAST(CONCAT('[',
={"parentProperty1": "value1", "parentProperty2": "value2", "children": [{"childProperty1": "value3", "childProperty2": "value4"}, {"childProperty1": "value5", "childProperty2": "value6"}]}}]

问题:

  1. 是否有现有的 EIP 可以解决我的问题?
  2. 为什么在我的 2. 方法中没有正确的 JSON?

提前致谢

【问题讨论】:

    标签: java mysql json apache-camel camel-sql


    【解决方案1】:

    您实际上得到的是一个键值对。由于在查询中没有为 json_obect 提供别名,mysql 会生成一个默认的列名。这就是您在结果中看到的查询 sn-p。

    为查询中的json_obect添加别名,如下所示:

        select json_object(
          'parentProperty1', parentProperty1
        , 'parentProperty2', parentProperty2
        , 'children', (select CAST(CONCAT('[',
                    GROUP_CONCAT(
                      JSON_OBJECT(  
                              'childProperty1', childProperty1
                            , 'childProperty2', childProperty2
                            )),
                    ']')
             AS JSON) 
            from childTable c
            where p.messageId=c.messageId
            )
        ) as result  
    from parentTable p;
    

    这将返回如下内容:

    {result={"children": [{"childProperty1": "value3", "childProperty2": "value4"}, {"childProperty1": "value5", "childProperty2": "value6"}], "parentProperty1": "value1", "parentProperty2": "value2"}}
    

    希望这能解决你的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      相关资源
      最近更新 更多