从数据库到 HashMap 的 Dataweave 键值集
Dataweave key value set from database to HashMap
我的流程是这样的:
我收到一个有效负载,其中包含以下内容:
['BobsFirstStatus', 'BobsSecondStatus', 'BobsEightStatus']
我在我的数据库中有一个查找 table,如下所示:
ID_|_BobStatusName___|_InternalStatusName_____
1 | BobsFirstStatus | Internal_1stStatus
2 | BobsSecondStatus| Internal_2ndStatus
3 | BobsEighStatus | Internal_3rdStatus
我想从数据库中读取这些数据,并加载一个 HashMap 如下所示:
{
"BobsFirstStatus": "Internal_1stStatus",
"BobsSecondStatus": "Internal_2ndStatus",
"BobsEighStatus": "Internal_3rdStatus"
}
这样,我可以在数据编织语句中执行 "flowVars.Lookup[payload.BobStatus]" 来检索状态的内部映射。
以前有人做过吗?好像有用...
可靠的计划,尽管我不喜欢在流变量中这样做。您可以简单地创建一个查找流程,然后从您的 DWL like so 中调用它。您可能希望使用缓存范围来避免每次都这样做。
我以前也在 spring bean 中做过,我对最终结果很满意。这仅适用于我希望仅在应用程序发布时或不经常更改的查找表。
创建一个 Map 类型的 bean。您可以为此使用本机 Spring <util:map
>。使用 spring <entry>
elements
配置查找键和值
<util:map id="statusTable">
<entry key="BobsFirstStatus" value="Internal_1stStatus" />
<entry key="BobsSecondStatus" value="Internal_2ndStatus" />
<entry key="BobsEighStatus" value="Internal_3rdStatus" />
</util:map>
使用 MEL app
上下文对象引用 bean
#[app.registry.statusTable[flowVars.status]]
我最终通过使用 groovy 的脚本组件解决了我的问题,下面是我使用的 groovy 脚本(请注意,我在调用之前将有效载荷放入名为 "payload_cache" 的变量中数据库 select 组件):
def lookup = [:]
for (item in payload) {
lookup[item['external_code']] = item['internal_code']
}
flowVars.NewResults = new ArrayList()
def ContainingDTO = flowVars.payload_cache.ContainingDTO
if (ContainingDTO){
def ExternalItemList = ContainingDTO.ExternalItemList
if (ExternalItemList){
for (item in ExternalItemList){
try{
flowVars.NewResults.add(lookup[item])
}catch(Exception){
flowVars.NewResults.add('UNKNOWN')
}
}
}
}
我的流程是这样的:
我收到一个有效负载,其中包含以下内容:
['BobsFirstStatus', 'BobsSecondStatus', 'BobsEightStatus']
我在我的数据库中有一个查找 table,如下所示:
ID_|_BobStatusName___|_InternalStatusName_____
1 | BobsFirstStatus | Internal_1stStatus
2 | BobsSecondStatus| Internal_2ndStatus
3 | BobsEighStatus | Internal_3rdStatus
我想从数据库中读取这些数据,并加载一个 HashMap 如下所示:
{
"BobsFirstStatus": "Internal_1stStatus",
"BobsSecondStatus": "Internal_2ndStatus",
"BobsEighStatus": "Internal_3rdStatus"
}
这样,我可以在数据编织语句中执行 "flowVars.Lookup[payload.BobStatus]" 来检索状态的内部映射。
以前有人做过吗?好像有用...
可靠的计划,尽管我不喜欢在流变量中这样做。您可以简单地创建一个查找流程,然后从您的 DWL like so 中调用它。您可能希望使用缓存范围来避免每次都这样做。
我以前也在 spring bean 中做过,我对最终结果很满意。这仅适用于我希望仅在应用程序发布时或不经常更改的查找表。
创建一个 Map 类型的 bean。您可以为此使用本机 Spring
配置查找键和值<util:map
>。使用 spring<entry>
elements<util:map id="statusTable">
<entry key="BobsFirstStatus" value="Internal_1stStatus" />
<entry key="BobsSecondStatus" value="Internal_2ndStatus" />
<entry key="BobsEighStatus" value="Internal_3rdStatus" />
</util:map>
使用 MEL
app
上下文对象引用 bean#[app.registry.statusTable[flowVars.status]]
我最终通过使用 groovy 的脚本组件解决了我的问题,下面是我使用的 groovy 脚本(请注意,我在调用之前将有效载荷放入名为 "payload_cache" 的变量中数据库 select 组件):
def lookup = [:]
for (item in payload) {
lookup[item['external_code']] = item['internal_code']
}
flowVars.NewResults = new ArrayList()
def ContainingDTO = flowVars.payload_cache.ContainingDTO
if (ContainingDTO){
def ExternalItemList = ContainingDTO.ExternalItemList
if (ExternalItemList){
for (item in ExternalItemList){
try{
flowVars.NewResults.add(lookup[item])
}catch(Exception){
flowVars.NewResults.add('UNKNOWN')
}
}
}
}