0

私は Hibernate 基準、 と の間の関係Tutor(Studentつまり、 OneToManyone Tutorhas many Student) に慣れていません。次の hibernate クエリを試して、チューター名が Peter Smith であるすべての生徒を取得しようとしました。

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

そして、次の結果を得ました:

Shin Don
Robert Cage

次に、次のような同じクエリに対して Hibernate Criteria 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 および Tutor エンティティです。

学生.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 と基準で同じ結果が得られない理由を誰かが理解するのを手伝ってくれますか?

ありがとう。

4

1 に答える 1

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)
于 2013-03-24T12:50:31.987 に答える