HQL 查询问题
Issue with HQL query
我在尝试使用 HQL 从我的数据库中检索项目时遇到问题。我有 2 tables(学生和教室),我想检索所有学生以及他们所属的教室。
学生table
user_id | name | nick | password | surname | classroom_id
---------|-----------|-----------|-----------|-----------|--------------
2 | AAA | studentA | test123 | AAA | 1
3 | BBB | studentB | test321 | BBB | 1
教室table
classroom_id | name | year
--------------|------------|----------
1 | TestClass | 2016/2017
这里是 table 作为 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,支持 table 中的列名称对于 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
的字段。 hibernate应该怎么知道?它真的是你数据库中的一列吗?如果是,它是如何到达那里的?
Student.studentClass 的类型只是 Class 是否正确?它是自定义类型还是引用 java.lang.Class?它应该指向您的 Class 房间类型,不是吗?如果是这种情况,@JoinColumn(name = "class_id") 应该改为 @JoinColumn(name = "classroom_id")。但是然后根本不需要连接列注释,因为 hibernate 知道如何连接。
然后您可以将查询优化为:
SELECT ... FROM Student s JOIN s.studentClass c WHERE ...
在 HQL 中,您使用实体而不是表 - 因此,由于学生包含 class 房间,因此 hql 查询应该是:
Select student from Student student Join Fetch student.classroom
我在尝试使用 HQL 从我的数据库中检索项目时遇到问题。我有 2 tables(学生和教室),我想检索所有学生以及他们所属的教室。
学生table
user_id | name | nick | password | surname | classroom_id
---------|-----------|-----------|-----------|-----------|--------------
2 | AAA | studentA | test123 | AAA | 1
3 | BBB | studentB | test321 | BBB | 1
教室table
classroom_id | name | year
--------------|------------|----------
1 | TestClass | 2016/2017
这里是 table 作为 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,支持 table 中的列名称对于 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
的字段。 hibernate应该怎么知道?它真的是你数据库中的一列吗?如果是,它是如何到达那里的?
Student.studentClass 的类型只是 Class 是否正确?它是自定义类型还是引用 java.lang.Class?它应该指向您的 Class 房间类型,不是吗?如果是这种情况,@JoinColumn(name = "class_id") 应该改为 @JoinColumn(name = "classroom_id")。但是然后根本不需要连接列注释,因为 hibernate 知道如何连接。
然后您可以将查询优化为:
SELECT ... FROM Student s JOIN s.studentClass c WHERE ...
在 HQL 中,您使用实体而不是表 - 因此,由于学生包含 class 房间,因此 hql 查询应该是:
Select student from Student student Join Fetch student.classroom