JFX TableView 和 HQL 查询问题
Issue with JFX TableView and HQL query
尝试在 JavaFX TableView 中显示数据库中的数据时遇到了一个小问题。
我有一个学生table
user_id | name | nick | password | surname | classroom_id
---------|-----------|-----------|-----------|-----------|--------------
2 | AAA | studentA | test123 | AAA | 1
3 | BBB | studentB | test321 | BBB | 1
此 table 已连接到课堂 table
classroom_id | classrooName | classroomYear
--------------|--------------|-------------
1 | TestClass | 2016/2017
我正在使用此查询将所有学生与他们所属的教室联系在一起,这没问题。当我尝试打印出这些值时,一切都是正确的。
Select student from Student student Join Fetch student.classroom
现在,实际问题是 classroomName 和 classroomYear 没有显示在 TableView 中,例如 this(Jméno - 姓名,Příjmení - 姓氏,Nick - 尼克,Třída - 教室名称,Rok- 教室年)
这两列的单元格值工厂是
classroomNameColumn.setCellValueFactory(new PropertyValueFactory<>("classroomName"));
classroomYearColumn.setCellValueFactory(new PropertyValueFactory<>("classroomYear"));
现在,我设法显示所有数据的唯一方法是将 classroomName 和 classroomYear 添加到我的 Java 类 中,这会将它们添加为数据库中的 2 个额外列。我想这违背了用 id 加入他们的目的,有没有更好的方法可以让我的 TableView 中显示课堂数据?
编辑:这里是学生和课堂 Java 类
@Entity
public class Student extends User{
private Classroom classroom;
public Student() {
}
public Student(String name, String surname, String nick, String password, Classroom studentClassroom) {
super(name, surname, nick, password);
this.classroom = studentClassroom;
}
@ManyToOne
@JoinColumn(name = "classroom_id")
public Classroom getClassroom() {
return classroom;
}
public void setClassroom(Classroom classroom) {
this.classroom = classroom;
}
}
@Entity
public class Classroom {
private SimpleStringProperty classroomName = new SimpleStringProperty();
private SimpleStringProperty classroomYear = new SimpleStringProperty();
private int classroom_id;
public Classroom() {
}
public Classroom(String name, String year) {
classroomName.set(name);
classroomYear.set(year);
}
@Column(nullable = false)
public String getClassroomName() {
return classroomName.get();
}
public SimpleStringProperty nameProperty() {
return classroomName;
}
public void setClassroomName(String name) {
this.classroomName.set(name);
}
@Column(nullable = false)
public String getClassroomYear() {
return classroomYear.get();
}
public SimpleStringProperty classroomYearProperty() {
return classroomYear;
}
public void setClassroomYear(String year) {
this.classroomYear.set(year);
}
@Id
@GenericGenerator(name="id" , strategy="increment")
@GeneratedValue(generator="id")
public int getClassroom_id() {
return classroom_id;
}
public void setClassroom_id(int classroom_id) {
this.classroom_id = classroom_id;
}
}
你用的PropertyValueFactory
在Student
里找一个叫classroomName
的属性,显然不存在。您需要自己实现单元值工厂:
// assuming you declared
TableColumn<Student, String> classroomNameColumn ;
// ...
classroomNameColumn.setCellValueFactory(cellData -> {
Student student = cellData.getValue();
Classroom classroom = student.getClassroom();
if (classroom == null) return new SimpleStringProperty("");
return classroom.nameProperty();
});
课堂年也是如此。
尝试在 JavaFX TableView 中显示数据库中的数据时遇到了一个小问题。
我有一个学生table
user_id | name | nick | password | surname | classroom_id
---------|-----------|-----------|-----------|-----------|--------------
2 | AAA | studentA | test123 | AAA | 1
3 | BBB | studentB | test321 | BBB | 1
此 table 已连接到课堂 table
classroom_id | classrooName | classroomYear
--------------|--------------|-------------
1 | TestClass | 2016/2017
我正在使用此查询将所有学生与他们所属的教室联系在一起,这没问题。当我尝试打印出这些值时,一切都是正确的。
Select student from Student student Join Fetch student.classroom
现在,实际问题是 classroomName 和 classroomYear 没有显示在 TableView 中,例如 this(Jméno - 姓名,Příjmení - 姓氏,Nick - 尼克,Třída - 教室名称,Rok- 教室年)
这两列的单元格值工厂是
classroomNameColumn.setCellValueFactory(new PropertyValueFactory<>("classroomName"));
classroomYearColumn.setCellValueFactory(new PropertyValueFactory<>("classroomYear"));
现在,我设法显示所有数据的唯一方法是将 classroomName 和 classroomYear 添加到我的 Java 类 中,这会将它们添加为数据库中的 2 个额外列。我想这违背了用 id 加入他们的目的,有没有更好的方法可以让我的 TableView 中显示课堂数据?
编辑:这里是学生和课堂 Java 类
@Entity
public class Student extends User{
private Classroom classroom;
public Student() {
}
public Student(String name, String surname, String nick, String password, Classroom studentClassroom) {
super(name, surname, nick, password);
this.classroom = studentClassroom;
}
@ManyToOne
@JoinColumn(name = "classroom_id")
public Classroom getClassroom() {
return classroom;
}
public void setClassroom(Classroom classroom) {
this.classroom = classroom;
}
}
@Entity
public class Classroom {
private SimpleStringProperty classroomName = new SimpleStringProperty();
private SimpleStringProperty classroomYear = new SimpleStringProperty();
private int classroom_id;
public Classroom() {
}
public Classroom(String name, String year) {
classroomName.set(name);
classroomYear.set(year);
}
@Column(nullable = false)
public String getClassroomName() {
return classroomName.get();
}
public SimpleStringProperty nameProperty() {
return classroomName;
}
public void setClassroomName(String name) {
this.classroomName.set(name);
}
@Column(nullable = false)
public String getClassroomYear() {
return classroomYear.get();
}
public SimpleStringProperty classroomYearProperty() {
return classroomYear;
}
public void setClassroomYear(String year) {
this.classroomYear.set(year);
}
@Id
@GenericGenerator(name="id" , strategy="increment")
@GeneratedValue(generator="id")
public int getClassroom_id() {
return classroom_id;
}
public void setClassroom_id(int classroom_id) {
this.classroom_id = classroom_id;
}
}
你用的PropertyValueFactory
在Student
里找一个叫classroomName
的属性,显然不存在。您需要自己实现单元值工厂:
// assuming you declared
TableColumn<Student, String> classroomNameColumn ;
// ...
classroomNameColumn.setCellValueFactory(cellData -> {
Student student = cellData.getValue();
Classroom classroom = student.getClassroom();
if (classroom == null) return new SimpleStringProperty("");
return classroom.nameProperty();
});
课堂年也是如此。