2016-12-29 136 views
0

问题我尝试使用HQL从我的数据库检索项目时遇到问题。我有两张桌子(学生和教室),我想要将所有学生和他们所属的课室一起找回。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; 
} 

这是我得到的例外。

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 

我感谢所有的答案和想法,谢谢。

回答

0

在HQL,你的实体,而不是表的工作 - 因此,由于学生包含了教室HQL查询应该是:

Select student from Student student Join Fetch student.classroom 
+0

谢谢,查询工作。 –

+0

我还有一个问题吗?如果我只想选择具有特定类的学生(基于ID),查询将如何?我想过再次使用“where”,但那可能不起作用。 –

+0

从学生学生中选择学生加入获取student.classroom c其中c.id ='wanted id' – aviad

0

我想你会被你的财产名称烧毁。 JavaBeans指定bean的属性名称,如id,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; 
    } 
} 
+0

哦,我已经更早地将它更新到了课堂,并且我意外地在这里粘贴了旧版本。我收到了一个意外的标记'class'异常,并带有旧名称。我将编辑我的问题以正确显示名称。 –

+0

感谢您的建议。但是,即使命名适当,我也会遇到同样的例外情况。 –

0

其实没有现场对学生实体命名classroomId。 hibernate应该怎么知道?它真的是数据库中的一列吗?如果是的话,它是如何到达那里的?

这是正确的,Student.studentClass的类型只是类?它是一个自定义类型还是引用java.lang.Class?它应该指向您的“课堂”类型,不是吗?如果是这样的话,@JoinColumn(name =“class_id”)应该是@JoinColumn(name =“classroom_id”)。但是,因为hibernate知道如何连接,所以根本不需要连接列注释。

然后,你可以优化您的查询是这样的:

SELECT ... FROM Student s JOIN s.studentClass c WHERE ...

+0

我忘了在我的学生课中编辑ManyToOne注释。它应该说“classroom_id”,而不是“class_id”。在我的项目中,我已经拥有了它,我只是贴错了东西。 –

+0

但问题仍然是学生实体上没有字段classroom_id。这就是为什么例外:“无法解决property:classroom_id:model.Student” –