在Jaspersoft中使用复杂类型(列表和对象)的正确方法是什么?

时间:2016-12-30 12:05:41

标签: java jasper-reports mongodb-query jaspersoft-studio

请考虑使用以下文档的MongoDB集合:

"_id": "clientsInfo"
"data": {
    "clientsList" : [ 
        {
            "name" : "Mike",
            "country" : "USA"
        },
        ...
    ]
}

设置DataSet并定义Query之后......

{
    collectionName:'projectA',
    findQuery: {
        '_id':'clientsInfo',
    },
    findFields: {
        '_id':0,
        'data.clientsList':1
    },
}

...我可以使用以下表达式在文本字段内的JasperSoft Studio中显示获取数组的第一项(java.util.List类型):

$F{data.clientsList}.get(0)

但是,考虑到我想在名称/国家/地区表中展示整个数据......

问题1 :我如何访问任何字典字段?尝试get method我收到The method get(String) is undefined for the type Object.错误。但是,知道该对象是com.mongodb.BasicDBObject的实例,它应该继承该方法(参见doc)。

我还尝试将对象转换为org.json.JSONObject,但后来出现net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: (JSONObject)$F{data.clientsList}.get(0)错误。

问题2 :假设我们已经解决了第一个问题......我如何迭代列表不仅可以访问第一个项目,还可以根据数组长度访问所有项目?是否可以在JasperSoft表达式编辑器中使用for-loop语句? (if-then-else seems to be available

在此先感谢,任何指出我正确方向的线索都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

万一有人遇到和我一样的情况,我必须说整个方法都是错误的。

这不是关于创建一个简单的查询,它返回格式化为对象或对象列表的大块复杂数据,然后使用JasperSoft Studio对其进行操作。相反,我必须要做的是设计一个更详细的查询,它返回我想要直接使用的简单字段。这该怎么做?通过使用聚合框架。

所以,改变这个......

{
    collectionName:'projectA',
    findQuery: {
        '_id':'clientsInfo',
    },
    findFields: {
        '_id':0,
        'data.clientsList':1
    },
}

...为此...

{
    runCommand: {
    aggregate : 'projectA',
    pipeline : [
        {'$match': {'_id':'clientsInfo'}},
        {'$project': {'data.clientsList': 1}},
        {'$unwind': '$data'},
        {'$unwind': '$data.clientsList'}
        ]
    }
}

...是我获取namecountry字段以便在文本字段,表格等中使用它们的方式。