Java HQL查询的问题
尝试使用HQL从数据库检索项目时遇到问题。我有两个表(学生和教室),我想检索所有学生以及他们所属的教室 学生桌Java HQL查询的问题,java,database,hibernate,hql,Java,Database,Hibernate,Hql,尝试使用HQL从数据库检索项目时遇到问题。我有两个表(学生和教室),我想检索所有学生以及他们所属的教室 学生桌 user_id | name | nick | password | surname | classroom_id ---------|-----------|-----------|-----------|-----------|-------------- 2 | AAA | studentA | test123 |
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;
}
我很感激所有的答案和想法,谢谢。我想你会被你的财产名称烧焦。JavaBeans指定bean属性名,如id,其中setter/getter是public void setId(long id)和public long getId() 您当前的属性名称为x_id格式。我建议不要将属性名称与列名混淆。属性名可以是id,而支持表中的列名可以是类的class_id(命名不当,因为它与java.lang.class冲突) 附加编辑
事实上,学生实体上没有名为
classroomId
的字段。hibernate应该如何知道?它真的是数据库中的一列吗?如果是,它是如何到达那里的
学生的类型就是课堂,这是正确的吗?它是自定义类型还是引用java.lang.Class?它应该指向你的教室类型,不是吗?如果是这种情况,@JoinColumn(name=“class\u id”)应该改为@JoinColumn(name=“classk\u id”)。但是,因为hibernate知道如何连接,所以根本不需要连接列注释
然后,您可以将查询优化为以下内容:
选择。。。从Student s JOIN s.studentClass c,其中……
在HQL中,您使用的是实体而不是表-因此,由于Student包含一个教室,HQL查询应该是:
Select student from Student student Join Fetch student.classroom
哦,我之前已经把它更新到教室了,我不小心把旧版本贴在这里了。我收到一个旧名称的意外令牌“class”异常。我将编辑我的问题,以正确显示名称。谢谢你的建议。然而,即使使用正确的命名转换,我也会遇到同样的例外。我忘了在我的学生课堂上编辑manytone注释。它应该说“教室id”,而不是“班级id”。在我的项目中,我已经有过这样的情况,我只是粘贴了错误的东西。但问题仍然是学生实体上没有现场教室id。这就是为什么出现异常:“无法解析属性:教室id:model.Student”我可以再问一个问题吗?如果我只想选择特定班级的学生(基于id),查询会是什么样子?我想再次使用“where”,但这可能不起作用。从student-student-Join-Fetch-student.c教室中选择学生,其中c.id='wanted-id'
@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;
}
}
Select student from Student student Join Fetch student.classroom