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;
    }
}

你用的PropertyValueFactoryStudent里找一个叫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();
});

课堂年也是如此。