[英]Issue with HQL query
我在嘗試使用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
我感謝所有答案和想法,謝謝。
我認為您的財產名稱使您感到厭倦。 JavaBeans指定像id這樣的bean屬性名稱,其中的setter / getter是public void setId(long id)和public long getId()。
您當前的屬性名稱的格式為x_id。 我建議不要將屬性名稱與列名稱混淆。 屬性名稱可以是id,並且支持表中的列名稱可以是Class的class_id(名稱不佳,因為它與java.lang.Class沖突)。
附加編輯
@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;
}
}
實際上,學生實體上沒有名為classroomId
編號的字段。 冬眠應該怎么知道? 它真的是您數據庫中的一列嗎? 如果是,它是如何到達那里的?
並且Student.studentClass的類型只是Class是否正確? 它是自定義類型還是引用java.lang.Class? 它應該指向您的教室類型,不是嗎? 在這種情況下,@ JoinColumn(name =“ class_id”)應該改為@JoinColumn(name =“ classroom_id”)。 但是然后根本不需要聯接列注釋,因為休眠知道如何聯接。
然后,您可以優化查詢,例如:
SELECT ... FROM Student s JOIN s.studentClass c WHERE ...
在HQL中,您使用實體而不是表-因此,由於學生包含教室,因此hql查詢應為:
Select student from Student student Join Fetch student.classroom
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.