从数据库到 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 中做过,我对最终结果很满意。这仅适用于我希望仅在应用程序发布时或不经常更改的查找表。

  1. 创建一个 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>

  2. 使用 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')
            }
        }
    }
}