2016-12-29 5 views
0

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

Student стол

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 классов в случае, если кто хочет, чтобы их увидеть.

Student

@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 

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

ответ

0

В HQL, вы работаете с юридическими лицами, а не таблицы - таким образом, поскольку студент содержит класс номер запрос HQL должен быть:

Select student from Student student Join Fetch student.classroom 
+0

Спасибо, запрос работает. –

+0

Могу ли я задать еще один вопрос? Как выглядел бы запрос, если бы я хотел выбрать только студентов с определенным классом (на основе id)? Я думал снова использовать «где», но это, вероятно, не сработает. –

+0

Выберите студент из Студент-студент Присоединиться к Fetch student.classroom c Где c.id = 'wanted id' – aviad

0

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

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

ДОПОЛНИТЕЛЬНОЕ EDIT

@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; 
    } 
} 
+0

О, я уже обновил это до класса раньше, и я случайно вставил старую версию здесь. Я получил неожиданное исключение класса «класс» со старым именем. Я отредактирую свой вопрос, чтобы правильно показать имя. –

+0

Спасибо за предложение.Тем не менее, я получаю такое же исключение даже при правильной именованной конвеции. –

0

На самом деле нет никакого поля имени classroomId на студенческой Entity. Как знать о спячке? Это действительно колонка в вашей базе данных? Если да, то как он туда попал?

И правильно ли, что тип Student.studentClass - это просто класс? Это нестандартный тип, или он ссылается на java.lang.Class? Он должен вместо этого указывать на ваш класс, не так ли? Если это так, @JoinColumn (name = "class_id") должно быть @JoinColumn (name = "classroom_id"). Но тогда аннотации столбца соединения вообще не нужны, поскольку спящий режим знает, как присоединиться.

Тогда вы могли бы оптимизировать свой запрос на что-то вроде:

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

+0

Я забыл отредактировать аннотацию ManyToOne в своем классе Student. Он должен сказать «classroom_id», а не «class_id». У меня уже было такое, как в моем проекте, я просто приклеил не то. –

+0

Но проблема в том, что в классе Student Entity отсутствует поле classroom_id. Вот почему исключение: «не удалось разрешить свойство: classroom_id of: model.Student» –

Смежные вопросы