2010-09-22 63 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