【发布时间】: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