如何将MySQL查询转换为HQL查询?

时间:2010-09-22 11:54:11

标签: java hibernate hql

我是HQL的新手。这是一个mysql查询。我需要将其转换为HQL查询。请问有什么建议吗?

    `SELECT STUDENT.ID, STUDENT.NAME, STUDENT.GRADE_ID, STUDENT.CLASS, GRADE.NAME FROM
     STUDENT INNER JOIN GRADE ON STUDENT.GRADE_ID = GRADE.GRADE_ID`

学生[ID,NAME,GRADE_ID,CLASS]

评分为[GRADE_ID,GRADE_NAME]

上述查询的结果集将类似于ID,NAME,GRADE_NAME,CLASS。


最终更新:

我有两张桌子STUDENT[ID, NAME, GRADE_ID, CLASS] GRADE[GRADE_ID, GRADE_NAME]

使用SQL查询SELECT STUDENT.ID, STUDENT.NAME, STUDENT.GRADE_ID, STUDENT.CLASS, GRADE.NAME FROM STUDENT INNER JOIN GRADE ON STUDENT.GRADE_ID = GRADE.GRADE_ID 我曾经在SQL中使用新表STUDENT[ID, NAME, GRADE_NAME, CLASS]。 对于此函数,没有输入,返回类型是列表(结果表的所有记录)

这就是我想在HQL or JPQL中做的,如何获取对象列表,对象的属性是id,name,gradename,class。

如何使用HQL。

2 个答案:

答案 0 :(得分:3)

你不会在Hibernate中这样做。使用hibernate的重点是你正在处理对象。

所以我猜你的学生班级会有一个成绩等级列表

@Entity
public class Student{
    // accessors and id omitted
    @OneToMany(mappedBy="student")
    private List<Grade> grades;
}

@Entity
public class Grade{
    // accessors and id omitted
    @ManyToOne
    private Student student;
}

您可以通过session.get()查找成绩,然后grade.getStudent()访问该学生:

Grade grade = (Grade) session.get(Grade.class, gradeId);
Student student = grade.getStudent();

HQL查询是针对这些查找方法过于复杂的场景而设计的。

编辑:我刚才意识到问题被标记为jpa。那么你当然不会使用HQL,而是使用JPQL。而且你也会使用这段代码:

Grade grade = entityManager.find(Grade.class, gradeId); // no cast needed with JPA 2
Student student = grade.getStudent();

编辑:根据您在评论中添加的要求,我将数据模型更改为类似的内容(ids省略):

@Entity
public class Student{
    public List<Course> getCourses(){
        return courses;
    }
    public void setCourses(List<Course> courses){
        this.courses = courses;
    }
    @OneToMany(mappedBy="student")
    private List<Course> courses;
}

@Entity
public class Course{
    @ManyToOne(optional=false)
    private Student student;
    @ManyToOne(optional=false)
    private Grade grade;
    public void setStudent(Student student){
        this.student = student;
    }
    public Student getStudent(){
        return student;
    }
    public Grade getGrade(){
        return grade;
    }
    public void setGrade(Grade grade){
        this.grade = grade;
    }
}

@Entity
public class Grade{
    @OneToMany(mappedBy="grade")
    private Set<Course> courses;
    public void setCourses(Set<Course> courses){
        this.courses = courses;
    }
    public Set<Course> getCourses(){
        return courses;
    }
}

我会这样查询:

Grade grade = entityManager.find(Grade.class, 1L);
List<Student> studentsWithThisGrade = new ArrayList<Student>();
for(Course course : grade.getCourses()){
    studentsWithThisGrade.add(course.getStudent());
}

(但Grade可能不是实体,而是数值或枚举。)


事实证明,OP毕竟使用普通的休眠,没有JPA。因此,无论您何时看到entityManager.find(),请将session.get()替换为{{1}}: - )

答案 1 :(得分:0)

试试这个。

public List<Student> getByGradeId(EntityManager entityManager, Grade grade) {
   Query query = entityManager.createQuery("from Student where grade=:grade");
   query.setParameter("grade", grade);
   return (List<Student>) query.getResultList();
}

你也需要一个try / catch。

Read section 3.4 of this