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