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 的方法,其中 String 是键必须对应于 jasper 报告字段名称。 如果我这样做,jasper 报告中的字段数将等于我的查询返回的对象数。我的查询将返回可变数量的对象,所以我不知道如何在 jasper 动态中生成字段。或者我错了 在我对该问题的研究中发现了使用 CG lib 或 Javassist 的建议,但这是我以前从未使用过的方法。 那我不明白这个问题。您的 jasper reprot 有一些固定字段(固定名称)。您应该以某种方式获取字段名称的集合,并且您必须创建映射列表(每行一个映射。每个映射应该具有与从 jasper 获得的字段名称一样多的键/值对。

以上是关于Hibernate HQL - query.list() 返回对象数组的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

hibernate hql update操作

类型:。net;问题:HQL;结果:HQL: Hibernate查询语言

Hibernate(十三):HQL查询

hibernate之HQL

hibernate的hql语句条件查询查不到结果?

hibernate 一对多update操作的hql语句怎么写?