从数据库

时间:2015-07-08 17:02:21

标签: jsf jpa primefaces charts

我很难理解如何从数据库中显示PF图表。 PF用户文档主要涵盖了如何静态生成图表的示例(即:通过硬编码值)。在这个网站上,我只看到了一些关于如何从数据库生成PF图表的问题。我发现这个问题很有用:

PrimeFaces Chart From Database

但它并没有真正解释从DB正确实现PF图表所需的逻辑和方法。我自己尝试了以下示例。观点是:

<p:panel>
<p:barChart value="#{rigtestBean.cartChart}"/>
</p:panel>

托管bean方法:

public CartesianChartModel createRigTestModel() {
    cartChart = new CartesianChartModel();
    ChartSeries rigs = new ChartSeries();
    List<Rigtest> rList = rigFacade.findAll();
    Map<Object, Number> rigMap = new HashMap<>();        
    for(Rigtest o: rList) {

        rigMap.put(o.getCountry().getCountryname(), o.getRignum());

        rigs.setData(rigMap) ;
        cartChart.addSeries(rigs);

    }
    return cartChart;

}

上面与一个名为RigTest的表进行交互,该表具有以下值(国家名称,钻机数量,日期):

国家/地区名称:美国,美国,法国,法国 钻机数量:2,20,40,200

运行代码时,结果图中只会拾取两个数据点。这些是2和200,其余的图表系列似乎被忽略了。调试器显示正确填充了地图,并且还正确填充了图表系列('rigs')。这表明问题在于我将系列添加到CartesianChartrmodel实例('cartChart')的方式。非常感谢任何关于我出错的建议。在更广泛的问题上,我可以阅读有关使用JPA从CRUD操作实现PF图表的一些材料的任何建议。提前致谢。

2 个答案:

答案 0 :(得分:1)

Kukeltje的评论帮助我找到了答案。在我的原始方法中,CartesianChartModel的初始化发生在方法的开头。由于这个create方法是由bean getter方法调用的,因此在create的开头初始化模型实例似乎有几个循环效果,导致增强的for循环将地图中的每个记录视为一个系列。这意味着6条记录循环36次,7条记录49次,依此类推。

在for循环和地图填充之后初始化模型实例似乎可以解决问题,并在条形图中生成正确数量的记录。

public void createRigTestModel() {

    ChartSeries rigs = new ChartSeries();

    List<Rigtest> rList = rigFacade.findAll();

    Map<Object, Number> rigMap = new HashMap<>();
    for (Rigtest o : rList) {

        rigMap.put(o.getRigtestid(), o.getRignum());

        cartChart = new CartesianChartModel();
        rigs.setData(rigMap);
        cartChart.addSeries(rigs);

    }

}

答案 1 :(得分:0)

例如,如果要显示条形图,则图表系列可以是一组条形图。因此,您必须为for..loop中的每个条形设置数据,并在此循环之后将图表系列添加到模型中。 您可以在图表模型中添加许多系列(条形图集)。

代码可以是:

public CartesianChartModel createRigTestModel() {
 cartChart = new CartesianChartModel();
 ChartSeries rigs = new ChartSeries();
 List<Rigtest> rList = rigFacade.findAll();

 for(Rigtest o: rList) {
    rigs.set(o.getCountry().getCountryname(), o.getRignum());       
 }
 cartChart.addSeries(rigs);

 return cartChart;

}

我希望这会有所帮助。