Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate条件API和Hibernate查询语言之间的结果冲突_Hibernate_Hql_Hibernate Criteria_Restrictions - Fatal编程技术网

Hibernate条件API和Hibernate查询语言之间的结果冲突

Hibernate条件API和Hibernate查询语言之间的结果冲突,hibernate,hql,hibernate-criteria,restrictions,Hibernate,Hql,Hibernate Criteria,Restrictions,我不熟悉Hibernate标准,Tutor和Student之间的关系是OneToMany(即一个Tutor有许多Student),我尝试按照Hibernate查询来检索导师名为Peter Smith的所有学生: from Student student where student.tutor.name is 'Peter Smith' 并得到以下结果: Shin Don Robert Cage 然后,我尝试使用Hibernate Criteria API进行相同的查询,如下所示: Crite

我不熟悉Hibernate标准,
Tutor
Student
之间的关系是
OneToMany
(即一个
Tutor
有许多
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.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

}
@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

}
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

}
@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

}
对于条件,我得到以下SQL:

select
...
...
from
    Tutor tutor0_ 
left outer join
    Student students1_ 
        on tutor0_.id=students1_.tutor_id 
where
    tutor0_.id=?
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和标准,我得不到相同的结果吗


谢谢。

更改您的
Tutor.java

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


是的,这让它工作了,但是Hibernate工具仍然给了Shin Don Shin Don Robert Cage Robert Cage。但是当通过独立Java类进行测试时,它可以正常工作。如果我没有在导师课程中更改
fetch
策略的选项,该怎么办?为什么HQL和条件查询的行为不同?