繁体   English   中英

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

[英]How to convert MySQL query into HQL query?

我是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 [GRADE_ID,GRADE_NAME]

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


最终更新:

我有2个表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我曾用来显示新表STUDENT[ID, NAME, GRADE_NAME, CLASS]正在使用SQL。 这个函数没有输入,返回类型是一个列表(结果表的所有记录)

这是我想在HQL or JPQL ,如何获取对象列表,其中对象的属性为id,名称,等级名称,类。

如何使用HQL做到这一点。

您不会在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();

编辑:给定您在注释中添加的要求,我会将数据模型更改为以下形式(省略了ID):

@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()entityManager.find()替换为session.get() :-)

尝试这个。

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();
}

您也需要在那里尝试/捕捉。

阅读本节3.4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM