2012-05-28 81 views
1

我使用iREPORT分享到人人4.1.1休眠JPA和我有检索两个实体的查询:获取值报告

select a,b from TableA a left join a.tableBList b 

我想获得的价值A和b,在Java中,它返回一个对象有两个元素的数组(对象[]),但是当我尝试这样做的碧玉报告它给了我这个错误:

Exception in thread "main" net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : fieldName 

我以为只有我需要用将返回的对象的名称替换fieldName,但我不知道它,我试图找到它b我没有成功,你们中的任何人都可以帮我吗?

感谢提前:)

+0

不确定hibrenate是如何做的,但我会检查每一行返回的是否是Object [],这意味着如果您的查询返回5行,那么您将得到5个Object数组的列表。 'Object [0]'会有'a','Object [1]'会有'b'。所以,如果你做'$ F {fieldName} [0]'它会给你'a',你可以访问那个对象的属性。 –

+0

@jschoen是我已经尝试过,它应该工作,问题是,我必须指定字段名称,但我不能得到该名称,例如,如果我的查询返回一个实体名为'人'这个实体有一个属性命名为'age',所以如果我想访问该属性,我声明一个名为'age'的字段,并且可以使用'$ F {age}'访问该属性,但是在查询返回数组两个对象,我不知道什么名字给这个领域,我解释我? – oware

+0

啊,那不是领域。你的领域实际上是一个对象数组。假设你在你的报告中命名了对象数组“row”,那么它会看起来像'$ F {row} [0] .getAge()'。这可能会也可能不会,因为您可能需要将'$ F {row}'强制转换为'Person'类,这意味着您需要将该类添加到iReport的类路径中进行编译。但是,如果你需要施放它,应该看起来像'((Person)$ F {row} [0])。getAge()'。这一切都是我的头顶,所以你的里程可能会有所不同。 –

回答

0

这个错误是因为你的数据不与豆类属性映射,或者你可以在你的数据模式不按beans属性。我在我的java项目中遇到了同样的问题。我整理出来,你的数据应该是在一个适当的二维数组的形式,然后我把样本数据从一个地方,这样做,

String[][] data = 
{{ "N263Y", "T-11", " 39 ROSCOE TRNR RACER"}, 
{ "N4087X", "BA100-163", "BRADLEY AEROBAT"}, 
{ "N43JE", "HAYABUSA 1", "NAKAJIMA KI-43 IIIA"}, 
{ "N912S", "9973CC", "PA18-150"}}; 

     JTable m = new JTable(data,headers); 
try { 

      JasperReport jasperReport = JasperCompileManager.compileReport(fileName); 

      if(jasperReport != null) 
       System.out.println("so far so good "); 

      // Fill the report using an empty data source 

      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JRTableModelDataSource(m.getModel()));//create());//con.connection); 
      try{ 
      JasperExportManager.exportReportToPdfFile(jasperPrint, outFileName); 
      System.out.printf("File exported sucessfully"); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      JasperViewer.viewReport(jasperPrint); 

     } catch (JRException e) { 
      JOptionPane.showMessageDialog(null, e); 
      e.printStackTrace(); 
      System.exit(1); 
     } 

注:

你的字段名应以小写字母开始,此外,字段名称应该小于您在该数据中提供的列名称。

希望这会帮助你。

+0

是否需要我使用空数据源?因为在我的报告中,我在做'嵌套'查询并且emptydatasource对我不起作用,所以我需要在报告中执行查询 – oware