Apache Camel:如何将分层数据从数据库转换为 pojo
Apache Camel: How to transform hierarchical data from database into pojo
我是 Whosebug 和 Apache Camel 的新手。我试着写一个可以理解的问题描述。
我的目标是从数据库 (mysql) 中读取分层数据,该数据由父 table 中的 1 个条目和子 table 中的几行组成,并转换这些数据进入一个pojo。
子目标:不编写太多自定义代码并使用蓝图 xml.
由于我找不到适合这个问题的EIP,我在这里列出我目前的做法:
1. Select 联合查询的数据
select * from parentTable join childTable on childTable.parentId=parentTable.id
这意味着编写自定义处理器将结果转换为 pojo,因为每次父属性时,每个结果行都会获取 select 结果。由于我尽量避免编写自定义处理器,因此我尝试了以下操作:
2。 Select 查询 returns 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 returns 上执行查询 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"}]}}]
问题:
- 是否有现成的EIP可以解决我的问题?
- 为什么我的 2. 方法没有正确的 JSON 结果?
提前致谢
你实际得到的是一个键值对。由于在查询中没有为 json_obect 提供别名,因此 mysql 生成一个默认列名。这就是您在结果中看到的查询片段。
在查询中为 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;
这会 return 像这样:
{result={"children": [{"childProperty1": "value3", "childProperty2": "value4"}, {"childProperty1": "value5", "childProperty2": "value6"}], "parentProperty1": "value1", "parentProperty2": "value2"}}
希望这能解决您的问题
我是 Whosebug 和 Apache Camel 的新手。我试着写一个可以理解的问题描述。
我的目标是从数据库 (mysql) 中读取分层数据,该数据由父 table 中的 1 个条目和子 table 中的几行组成,并转换这些数据进入一个pojo。 子目标:不编写太多自定义代码并使用蓝图 xml.
由于我找不到适合这个问题的EIP,我在这里列出我目前的做法:
1. Select 联合查询的数据
select * from parentTable join childTable on childTable.parentId=parentTable.id
这意味着编写自定义处理器将结果转换为 pojo,因为每次父属性时,每个结果行都会获取 select 结果。由于我尽量避免编写自定义处理器,因此我尝试了以下操作:
2。 Select 查询 returns 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 returns 上执行查询 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"}]}}]
问题:
- 是否有现成的EIP可以解决我的问题?
- 为什么我的 2. 方法没有正确的 JSON 结果?
提前致谢
你实际得到的是一个键值对。由于在查询中没有为 json_obect 提供别名,因此 mysql 生成一个默认列名。这就是您在结果中看到的查询片段。
在查询中为 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;
这会 return 像这样:
{result={"children": [{"childProperty1": "value3", "childProperty2": "value4"}, {"childProperty1": "value5", "childProperty2": "value6"}], "parentProperty1": "value1", "parentProperty2": "value2"}}
希望这能解决您的问题