【问题标题】:How to Populate JavaFX LineChart by Hibernate Query?如何通过 Hibernate Query 填充 JavaFX LineChart?
【发布时间】:2020-09-29 17:00:24
【问题描述】:

我正在尝试将 HQL 选择查询的结果填充到 JavaFX PieChart 中。 我将 HQL 查询的结果转换为 List 对象并将其转换为 ObservableArrayList 对象并将该对象传递给 PieChart 的对象。

模型类

@Entity
@Immutable
public class ReportView 
{
    @Id
    private long srno;
    private int oid;
    private float rate;
    private String category;
    private String company;
    private Date date;
    private String party;
    private String product;
    private int qty;
    private float price;
    private float cost;
    private float ttl_price;
    private float ttl_cost;
    private float profit;

    // getters and setters

}

我尝试如下,

String cmbVal = "";
Configuration cfg = null;
Session session = null;
Transaction tx = null;
SessionFactory sf = null;
List<String> list = new ArrayList<String>();
Iterator it = null;
XYChart.Series series;
String[] month = new String[]{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"};
ObservableList obsList = null;

@FXML
private PieChart pieChart;

@Override
public void initialize(URL url, ResourceBundle rb) {
    cfg = new Configuration().configure()
        .addAnnotatedClass(ReportView.class)
        .addAnnotatedClass(Product.class);
    sf = cfg.buildSessionFactory();

    plotPieChart();

}  

public void plotPieChart() {
    pieChart.getData().clear();

    beginTx();
    list = session.createQuery("select MONTH(date), SUM(qty) from ReportView where lower(product) = lower(:prd) and YEAR(date) = YEAR(current_date()) group by product, MONTH(date) order by MONTH(date)")
                .setString("prd", "dell inspiron 3845")
                .list();
    endTx();

    obsList = FXCollections.observableArrayList(list);
    pieChart.setData(obsList);

}

public void beginTx() {
    session = sf.openSession();        
    tx = session.beginTransaction();
}

public void endTx() {
    tx.commit();        
    session.close();
}

Hibernate Select Query 的结果如下

错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javafx.scene.chart.PieChart$Data
    at javafx.scene.chart.PieChart.lambda$new$574(PieChart.java:142)
    at javafx.scene.chart.PieChart$2.invalidated(PieChart.java:204)
    at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:111)
    at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146)
    at javafx.beans.property.ObjectProperty.setValue(ObjectProperty.java:69)
    at javafx.scene.chart.PieChart.setData(PieChart.java:234)
    at Progress.FXMLDocumentController.plotPieChart(FXMLDocumentController.java:202)
    at Progress.FXMLDocumentController.plotGraph(FXMLDocumentController.java:159)
    at Progress.FXMLDocumentController.initialize(FXMLDocumentController.java:114)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at Progress.GraphDemo.start(GraphDemo.java:22)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)

如何解决at line的错误

obsList = FXCollections.observableArrayList(list);

?

其他图表也出现同样的错误,如何解决?

【问题讨论】:

  • 请比较列表中包含的值类型与将数据设置到图表时所需的类型 - 并且不相关:公开显示代码时遵守 java 命名约定!

标签: hibernate jpa javafx orm hql


【解决方案1】:

我找到了解决方案,

public void plotPieChart()
    {
        pieChart.getData().clear();

        beginTx();
        listObj = session.createQuery("select MONTH(date), SUM(qty) from ReportView where lower(product) = lower(:prd) and YEAR(date) = YEAR(current_date()) group by product, MONTH(date) order by MONTH(date)")
                .setString("prd", cmbBox[0].getEditor().getText())
                .list();
        endTx();

        obsList = FXCollections.observableArrayList();

        for(Object[] row : listObj)
        {
            obsList.add(new PieChart.Data(month[((Integer)row[0])-1], new Double(row[1].toString())));
        }

        pieChart.setData(obsList);

    }

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2010-11-17
    • 2017-06-16
    • 2018-07-03
    • 2016-12-23
    相关资源
    最近更新 更多