Hibernate条件API和Hibernate查询语言之间的结果冲突
我不熟悉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
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和条件查询的行为不同?