Проблема с jfx TableView и HQL query

У меня есть небольшая проблема при попытке отобразить данные из моей базы данных в JavaFX TableView.

У меня есть студенческий стол

user_id  |   name    |    nick   |  password |  surname  | classroom_id
---------|-----------|-----------|-----------|-----------|--------------
   2     |   AAA     | studentA  |  test123  |   AAA     |     1
   3     |   BBB     | studentB  |  test321  |   BBB     |     1

Эта таблица подключена к таблице класса

  classroom_id | classrooName | classroomYear 
 --------------|--------------|-------------
       1       |  TestClass   |  2016/2017

Я использую этот запрос, чтобы собрать всех студентов вместе с классами, к которым они принадлежат, здесь нет проблем. Когда я пытаюсь распечатать значения, все правильно.

Select student from Student student Join Fetch student.classroom

Теперь, фактическая проблема заключается в том, что classroomName и classroomYear не отображаются в TableView, как это (Jméno — имя, Příjmení-фамилия, Ник-Ник, Třída-имя класса, Rok-класс год)

Фабрика значений ячеек для этих 2 столбцов

classroomNameColumn.setCellValueFactory(new PropertyValueFactory<>("classroomName"));

classroomYearColumn.setCellValueFactory(new PropertyValueFactory<>("classroomYear"));

Теперь единственный способ, которым мне удалось получить все данные для отображения, состоял в том, чтобы добавить classroomName и classroomYear к моим классам Java, которые добавили их в качестве 2 дополнительных столбцов в базе данных. Этот вид поражает цель присоединения к ним с идентификатором я думаю, есть ли лучший способ, которым я могу получить данные класса, отображаемые в моем TableView?

EDIT: здесь студент и класс Как классы 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;
    }
}

1 ответ

  1. PropertyValueFactoryВы используете ищет свойство в StudentcalledclassroomName, который, очевидно, не существует. Необходимо реализовать фабрику значений ячеек самостоятельно:

    // 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();
    });
    

    и точно так же для учебного года.