簡體   English   中英

HQL查詢問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM