Java HQL查询的问题

Java HQL查询的问题,java,database,hibernate,hql,Java,Database,Hibernate,Hql,尝试使用HQL从数据库检索项目时遇到问题。我有两个表(学生和教室),我想检索所有学生以及他们所属的教室 学生桌 user_id | name | nick | password | surname | classroom_id ---------|-----------|-----------|-----------|-----------|-------------- 2 | AAA | studentA | test123 |

尝试使用HQL从数据库检索项目时遇到问题。我有两个表(学生和教室),我想检索所有学生以及他们所属的教室

学生桌

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