Hibernate HQL - query.list() 返回对象数组的对象数组
Posted
技术标签:
【中文标题】Hibernate HQL - query.list() 返回对象数组的对象数组【英文标题】:Hibernate HQL - query.list() return Object array of object arrays 【发布时间】:2015-11-30 06:52:15 【问题描述】:我正在编写 HQL 查询。根据我认为的条件,我在 SELECT
子句中添加选择(选择的数量从 1 到大约 20)。在查询休眠中使用list()
将返回对象数组的对象数组,至少我认为是这样。如果我遍历结果
Iterator<Object[]> itr = result.iterator();
while(itr.hasNext())
Object[] obj = (Object[]) itr.next();
System.out.println(obj); //1st
for (int br = 0; br <= obj.length-1;br ++)
System.out.print(obj[br].toString() + ","); //2nd
第一个Sytsem.out prints
每个对象数组和第二个打印它们的内容。测试输出到控制台很好。
我尝试将结果用于 Jasper Reports,但不知何故无法访问每个 Object 数组的内容。有人可以给我建议或建议一种方法,例如将结果转换为我可以在报告中使用的格式。
【问题讨论】:
把你的Jasper Report
代码放在这里。
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(result); JasperDesign jasperDesign = JRXmlLoader.load(pathToReport); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, beanColDataSource);
【参考方案1】:
JRBeanCollectionDataSource 假设 bean 集合 - POJO 类。然后它尝试通过 Jasper 报告的字段名称找到该类的正确字段。
因此,如果在 Jasper Report 中定义字段“userName”,JRBeanCollectionDataSource 会获取 POJO 类并尝试查找类字段“userName”。
在你的情况下,你得到的不是 POJO 类,而是数组 Object[]。所以找不到名为“用户名”的字段。
我建议定义 DTO(数据传输对象)并将 Object[] 转换为 DTO。因此,您将拥有 List 并且 JRBeanCollectionDataSource 可以解析正确的名称。
一个简单的方法是定义结果转换器。
.setResultTransformer( Transformers.aliasToBean(ResultsDTO.class))
另见this
【讨论】:
是的,这将是我处理此问题的常用方式,但这里因为我的SELECT
子句根据条件而变化,我不知道我需要在 DTO 中声明的字段数。
您可以使用 JRMapCollectionDataSource(地图列表)。只需创建一种将 Object[] 转换为 Map以上是关于Hibernate HQL - query.list() 返回对象数组的对象数组的主要内容,如果未能解决你的问题,请参考以下文章