2013-03-23 36 views
0

我對Hibernate的標準,TutorStudent之間的關係是OneToMany(即一個Tutor有很多Student),我嘗試以下Hibernate查詢檢索所有學生的導師名字是彼得·史密斯:衝突Hibernate的標準API和Hibernate查詢語言之間的結果

from Student student where student.tutor.name is 'Peter Smith' 

,並得到了如下結果:

Shin Don 
Robert Cage 

,然後我試圖休眠標準API爲同查詢如下:

Criteria criteria = session.createCriteria(Student.class); 
criteria.createCriteria("tutor").add(Restrictions.eq("name", "Peter Smith")); 
criteria.list(); 

這一次,我得到以下結果:

Shin Don 
Shin Don 
Robert Cage 
Robert Cage 

以下是學生和導師的實體,我有:

Student.java

@Entity 
public class Student { 

    private Integer id; 
    private String studentId; 
    private String name; 
    private Tutor tutor; 
    //remaining fields 

    public Student() {} 
    public Student(String studentId, String name) { 
     super(); 
     this.studentId = studentId; 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue 
    public Integer getId() { 
     return id; 
    } 

    @Column(unique=true, nullable=false) 
    public String getStudentId() { 
     return studentId; 
    } 

    @ManyToOne 
    @JoinColumn(name="tutor_id") 
    public Tutor getTutor() { 
     return tutor; 
    } 

    @Override 
    public int hashCode() { 
     //returns hashcode based on studentId 
    } 
    @Override 
    public boolean equals(Object obj) { 
     //returns true or false based on studentId 
    } 
    @Override 
    public String toString() { 
     return this.name; 
    } 

    //remaining getter and setter methods 

} 

Tutor.java

@Entity 
public class Tutor{ 

    private Integer id; 
    private String tutorId; 
    private String name; 
    private Set<Student> students = new HashSet<Student>(); 
    //remaining fields 

    public Tutor() {} 
    public Tutor(String tutorId, String name) { 
     super(); 
     this.tutorId = tutorId; 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue 
    public Integer getId() { 
     return id; 
    } 

    @Column(unique=true, nullable=false) 
    public String getTutorId() { 
     return tutorId; 
    } 

    @OneToMany(mappedBy="tutor", targetEntity=Student.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    public Set<Student> getStudents() { 
     return students; 
    } 

    @Override 
    public int hashCode() { 
     //returns hashcode based on tutorId 
    } 
    @Override 
    public boolean equals(Object obj) { 
     //returns true or false based on tutorId 
    } 

    public void addStudent(Student student) { 
     this.students.add(student); 
     student.setTutor(this); 
    } 

    //remaining setter and getter methods 

} 

對於HQL我碰到下面的SQL:

select 
... 
... 
from 
    Tutor tutor0_ 
left outer join 
    Student students1_ 
     on tutor0_.id=students1_.tutor_id 
where 
    tutor0_.id=? 

爲標準,我得到了下面的SQL:

select 
... 
... 
from 
    Student this_ 
inner join 
    Tutor tutor1_ 
     on this_.tutor_id=tutor1_.id 
left outer join 
    Student students4_ 
     on tutor1_.id=students4_.tutor_id 
where 
    tutor1_.name=? 

有人能幫助我瞭解爲什麼我沒有得到同樣的給定的HQL和標準的結果?

謝謝。

回答

1

改變你Tutor.java

 @OneToMany(mappedBy="tutor", targetEntity=Student.class, 
cascade=CascadeType.ALL, fetch=FetchType.EAGER) 

 @OneToMany(mappedBy="tutor", targetEntity=Student.class, 
cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
+0

是的,懂了工作,但休眠工具的仍然給辛旽辛旽羅伯特·凱奇羅伯特籠。但是,當通過獨立的Java類進行測試時,它可以正常工作。如果我沒有選擇更改Tutor類中的'fetch'策略會怎麼樣?爲什麼HQL和Criteria查詢有不同的行爲? – skip