【发布时间】:2019-09-14 20:28:00
【问题描述】:
虽然我的 HQL 查询在 Hibernate 控制台中运行良好,但 我得到奇怪的结果。 我尝试结合相应列的@FXML 注释更改下面的行,但要么我得到错误,要么我得到空白单元格。 vstcolName.setCellValueFactory(new PropertyValueFactory("peopleByPeopleId"));
这是我的第一个表的实体类。
package Entities;
import javax.persistence.*;
import java.util.Objects;
@Entity
@Table(name = "people", schema = "learn", catalog = "")
public class PeopleEntity {
private int pplId;
private String pplName;
@Id
@Column(name = "pplID")
public int getPplId() {
return pplId;
}
public void setPplId(int pplId) {
this.pplId = pplId;
}
@Basic
@Column(name = "pplName")
public String getPplName() {
return pplName;
}
public void setPplName(String pplName) {
this.pplName = pplName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PeopleEntity that = (PeopleEntity) o;
return pplId == that.pplId &&
Objects.equals(pplName, that.pplName);
}
@Override
public int hashCode() {
return Objects.hash(pplId, pplName);
}
}
这是我的第二张表的实体类。
package Entities;
import javax.persistence.*;
import java.util.Objects;
@Entity
@Table(name = "places", schema = "learn", catalog = "")
public class PlacesEntity {
private int plcId;
private String place;
private PeopleEntity peopleByPeopleId;
@Id
@Column(name = "plcID")
public int getPlcId() {
return plcId;
}
public void setPlcId(int plcId) {
this.plcId = plcId;
}
@Basic
@Column(name = "place")
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PlacesEntity that = (PlacesEntity) o;
return plcId == that.plcId &&
Objects.equals(place, that.place);
}
@Override
public int hashCode() {
return Objects.hash(plcId, place);
}
@ManyToOne
@JoinColumn(name = "people_ID", referencedColumnName = "pplID")
public PeopleEntity getPeopleByPeopleId() {
return peopleByPeopleId;
}
public void setPeopleByPeopleId(PeopleEntity peopleByPeopleId) {
this.peopleByPeopleId = peopleByPeopleId;
}
}
这是我的模型,其中包含 HQL 查询。
package Models;
import Entities.PlacesEntity;
import Interfaces.PlacesIF;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class PlacesIM implements PlacesIF {
public List<PlacesEntity> readJoin() {
session = sessionFactory.openSession();
Query query;
query = session.createQuery("SELECT PlcEnt.place as PLACES, pep.pplName as NAMES FROM PlacesEntity as PlcEnt JOIN PlcEnt.peopleByPeopleId as pep");
List<PlacesEntity> tableList;
tableList = query.list();
return tableList;
}
}
这是 FXML 控制器
package FX;
import Entities.PeopleEntity;
import Entities.PlacesEntity;
import Models.PlacesIM;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
public class placesController implements Initializable {
//Visit TableView
@FXML
TableView<PlacesEntity> vstTView;
//I think that this line may need modification
@FXML
private TableColumn<PlacesEntity, PeopleEntity> vstcolName;
@FXML
private TableColumn<PlacesEntity, String> vstcolPlace;
public void readJoin() {
plcTView.getItems().clear();
List<PlacesEntity> tableList = plcIM.read();
for (PlacesEntity pEnt : tableList) {
observableList.add(pEnt);
}
//Here is the other tricky part (that's what i think at least)
vstcolName.setCellValueFactory(new PropertyValueFactory<PlacesEntity, PeopleEntity>("peopleByPeopleId"));
vstcolPlace.setCellValueFactory(new PropertyValueFactory<PlacesEntity, String>("place"));
vstTView.setItems(observableList);
}
}
在连接列中重新调整的数据是这样的 Entity.PeopleEntity@864db1b7
...等等... 我应该得到名字 - 我的意思是字符串.. 另一列正常显示。
顺便说一句,如果我尝试在控制台而不是 tableview 中显示 HQL 查询的结果,我会得到完全相同的结果。不要介意怪异列的变化。这是因为我试图将数字(仍然是 strind 数据类型)放在我以前拥有的名称的位置,看看是否会发生任何变化......但问题仍然存在。
【问题讨论】:
-
如果对象不是
Node,默认TableCell会显示对象的toString()。查看How can I Populate a ListView in JavaFX using Custom Objects?;虽然该问题与ListView有关,但对于TableColumn,过程几乎相同。 -
真的很困惑。这似乎与我的情况大不相同。我似乎无法理解我应该在哪里更改代码以及如何更改。我有列表,他有列表视图。我有一个 mysql dbd 并试图使用外键获取字符串的值,他正试图在方法中获取一些字符串。此外,除了外键之外,我对列没有问题。
-
如果我错了,请纠正我,但您遇到的问题是您的
Name列。该列中的那些单元格显示的内容(例如Entities.PeopleEntity@864db1b7)表示默认(即未覆盖)Object#toString()方法。查看您的代码,该列是一个TableColumn<PlacesEntity, PeopleEntity>,这意味着该列中每个TableCell包含的值是一个PeopleEntity实例。默认的TableCell实现(在未指定自定义单元工厂时使用)不知道如何显示PeopleEntity。您必须通过cellFactory告诉它如何操作。
标签: hibernate join javafx tableview hql