ApacheCamel:如何将数据库中的分层数据转换为pojo



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

我的目标是从数据库(mysql(中读取分层数据,该数据库由父表中的1个条目和子表中的几行组成,并将这些数据转换为pojo。子目标:不编写太多的自定义代码并使用blueprint 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
;

在mysqlshell上执行查询会返回预期的JSON:

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

在骆驼内部运行查询时,我遇到了一个问题,我还找不到解释,也找不到解决方案。

主体在执行查询后有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作为结果。方法

提前感谢

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

在查询中为json_oct添加别名,如下所示:

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"}}

希望这能解决你的问题

最新更新