2010-09-22 64 views
1

我是HQL新手。这是一个mysql查询。我需要将其转换为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` 

STUDENT [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做到这一点。

+0

您是否知道表名中有拼写错误? – BalusC 2010-09-22 12:11:13

+0

我个人从未做过复制/粘贴错误。等等,如果那真的是桌子的名字! – 2010-09-22 12:21:00

+0

@ BALUSC,@ TONY它的“学生”我错误地输入了它。抱歉。 – 2010-09-22 12:28:33

回答

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

(但等级应可能不是一个实体,但无论是数值或枚举)


事实证明,OP使用纯朴的休眠,毕竟没有JPA。因此,无论何时您看到上述entityManager.find(),请在您的想法中将其替换为session.get() :-)

+0

我宁愿认为很多学生可以分享一个等级。因此,他可能试图找到所有获得“B”的学生。在这种情况下,查询是适当的。 – 2010-09-22 12:37:46

+0

@SEANIZER我想要使用两个表之间的连接来获取整个表,其中GRADE_ID由GRADE_NAME替换。结果集不会有GRADE_ID列。 – 2010-09-22 12:38:41

+0

问题是,你仍然在思考表,而如果你使用hibernate和/或jpa,你应该考虑对象。请阅读:http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch – 2010-09-22 12:41:20

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

+0

@托尼,你是对的。我的要求是找到所有分享特定成绩的学生。我想在学生表中显示所有学生的详细信息。 – 2010-09-22 12:53:07

+0

很酷。然后你会调用上面的方法并遍历所得到的List。现在,请注意您必须将其传递给Grade实例。我会为我的GradeDAO添加一个名为'Grade getByGrade(EntityManager em,String gradeName)'的方法,它有一个类似的查询,返回等级为“B”的行或其他。但是,该方法将使用'query.getSingleResult()'而不是'getResultList()'。 – 2010-09-22 13:44:39

+0

@Tony请参阅我的最终更新。 – 2010-09-22 13:47:42