1
У меня есть два студента и колледжа. В одном колледже много учеников.Извлечение данных с использованием одного оператора select в HQL (от одного до многих отношений)
@Entity
public class College {
@Id
@GeneratedValue
private int collegeId;
private String collegeName;
public int getCollegeId() {
return collegeId;
}
public void setCollegeId(int collegeId) {
this.collegeId = collegeId;
}
public String getCollegeName() {
return collegeName;
}
public void setCollegeName(String collegeName) {
this.collegeName = collegeName;
}
}
@Entity
public class Student {
@Id
@GeneratedValue
private int studentId;
private String studentName;
@ManyToOne(cascade = CascadeType.ALL)
private College college;
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public College getCollege() {
return college;
}
public void setCollege(College college) {
this.college = college;
}
}
Теперь я хочу, чтобы выбрать всех студентов с сказать collegeId = 1. Я могу добиться этого с одного запроса на выборку с использованием нативного SQL:
Select * from student where collegeid = 1
Я не в состоянии достигнуть того же самого с одним выберите запрос с использованием HQL. Является ли это возможным? Если да, то как?
класс Полезность:
public class ManyToOne {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.hibernate.examples");
EntityManager em = emf.createEntityManager();
College college1 = new College();
college1.setCollegeName("College1");
College college2 = new College();
college2.setCollegeName("College2");
Student student1 = new Student();
student1.setStudentName("std1");
student1.setCollege(college1);
Student student2 = new Student();
student2.setStudentName("std2");
student2.setCollege(college2);
Student student3 = new Student();
student3.setStudentName("std3");
student3.setCollege(college1);
Student student4 = new Student();
student4.setStudentName("std4");
student4.setCollege(college1);
em.getTransaction().begin();
em.persist(college1);
em.persist(college2);
em.persist(student1);
em.persist(student2);
em.persist(student3);
em.persist(student4);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
String queryString = "select student from "+Student.class.getName()+" student where student.college.collegeId = 1";
Query query = em.createQuery(queryString);
List<Student> students = query.getResultList();
em.getTransaction().commit();
em.close();
emf.close();
}
}
Сформированные запросы:
Hibernate: select student0_.studentId as studentId1_1_, student0_.college_collegeId as college_collegeId3_1_, student0_.studentName as studentName2_1_ from mevada.Student student0_ where student0_.college_collegeId=1
Hibernate: select college0_.collegeId as collegeId1_0_0_, college0_.collegeName as collegeName2_0_0_ from mevada.College college0_ where college0_.collegeId=?
Я уже пробовал то же самое. Однако после выполнения select на студенческом hibernate выполняется дополнительный запрос в таблице колледжа. Невозможно понять, почему. My HQL: 'select student from" + Student.class.getName() + "student where student.college.collegeId = 1' –
Я добавил код моего класса полезности. –
Каковы запросы, выполняемые спящим режимом? Вы можете увидеть их, включив show_sql = true в конфигурации hibernate. –