Проблема с запросом HQL

У меня есть проблема, пытаясь получить элементы из моей базы данных с помощью HQL. У меня есть 2 таблицы (студент и класс), и я хочу получить всех студентов вместе с классом, к которому они принадлежат.

Студенческий стол

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

Классный стол

  classroom_id |   name     |    year 
 --------------|------------|----------
       1       | TestClass  |  2016/2017

Вот таблицы как классы Java на случай, если кто-то хочет их видеть.

Студенты

@Entity
public class Student extends User{

    private Class studentClass;

    public Student() {
    }

    public Student(String name, String surname, String nick, String password, Class studentClass) {
        super(name, surname, nick, password);
        this.studentClass = studentClass;
    }

    @ManyToOne
    @JoinColumn(name = "classroom_id")
    public Class getStudentClass() {
        return studentClass;
    }

    public void setStudentClass(Class studentClass) {
        this.studentClass = studentClass;
    }
}

Класс

@Entity
public class Classroom {

    private SimpleStringProperty name = new SimpleStringProperty();
    private SimpleStringProperty year = new SimpleStringProperty();

    private int classroom_id;

    public Classroom() {
    }

    public Classroom(String name, String year) {
        this.name.set(name);
        this.year.set(year);
    }


    @Column(nullable = false)
    public String getName() {
        return name.get();
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public void setName(String name) {
        this.name.set(name);
    }

    @Column(nullable = false)
    public String getYear() {
        return year.get();
    }

    public SimpleStringProperty yearProperty() {
        return year;
    }

    public void setYear(String year) {
        this.year.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;
    }

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

public List<Object> getAllStudentsWithClass(){
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction transaction = session.beginTransaction();
    String select = "SELECT student, classroom FROM Student student, Classroom classroom WHERE student.classroom_id = classroomm.classroom_id";
    Query query = session.createQuery(select);
    List<Object> list = query.list();
    return list;
}

Вот исключение, которое я получаю.

Exception in thread "JavaFX Application Thread" org.hibernate.QueryException: could not resolve property: classroom_id of: model.Student [SELECT student, classroom FROM model.Student student, model.Classroom classroom WHERE student.classroom_id = classroomm.classroom_id]

Caused by: org.hibernate.QueryException: could not resolve property: classroom_id of: model.Student

Я ценю все ответы и идеи, спасибо.

3 ответа

  1. Я думаю, что вы обжигаетесь своими именами собственности. JavaBeans задает имена свойств бобов, такие как id, где setter/getter являются public void setId(long id) и public long getId().

    Текущие имена свойств имеют форму x_id. Я бы не рекомендовал путать имя свойства с именем столбца. Имя свойства может быть id, а имя столбца в резервной таблице может быть class_id для класса (плохо названо, так как это конфликтует с java.ленг.Класс.)

    ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

    @Entity
    public class Classroom {
    
        private SimpleStringProperty name = new SimpleStringProperty();
        private SimpleStringProperty year = new SimpleStringProperty();
    
        // Follow JavaBeans naming conventions
        private int classroomId;
    
        public Classroom() {
        }
    
        public Classroom(String name, String year) {
            this.name.set(name);
            this.year.set(year);
        }
    
    
        @Column(nullable = false)
        public String getName() {
            return name.get();
        }
    
        public SimpleStringProperty nameProperty() {
            return name;
        }
    
        public void setName(String name) {
            this.name.set(name);
        }
    
        @Column(nullable = false)
        public String getYear() {
            return year.get();
        }
    
        public SimpleStringProperty yearProperty() {
            return year;
        }
    
        public void setYear(String year) {
            this.year.set(year);
        }
    
    
        @Id
        @GenericGenerator(name="id" , strategy="increment")
        @GeneratedValue(generator="id")
        public int getClassroomId() {
            return classroomId;
        }
    
        public void setClassroomId(int classroomId) {
            this.classroomId = classroomId;
        }
    }
    
  2. Фактически в сущности Student нет поля с именемclassroomId. Как hibernate должен знать о? Это действительно столбец в вашей базе данных? Если да, то как он туда попал?

    И правильно ли, что тип студента.studentClass это просто класс? Является ли он пользовательским типом или относится к java.ленг.Класс? Вместо этого он должен указывать на ваш тип класса, не так ли? В этом случае @JoinColumn(name = «class_id») должен быть @JoinColumn(name = «classroom_id»). Но тогда аннотация столбца join вообще не нужна, потому что hibernate знает, как присоединиться.

    Затем вы можете оптимизировать запрос к чему-то вроде:

    SELECT ... FROM Student s JOIN s.studentClass c WHERE ...

  3. В HQL вы работаете с сущностями, а не таблицами-таким образом, поскольку student содержит комнату класса, запрос hql должен быть:

    Select student from Student student Join Fetch student.classroom