2014-12-16 2 views
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=? 

ответ

1

HQL

Select * from Student s where s.college.collegeId = 1 
+0

Я уже пробовал то же самое. Однако после выполнения select на студенческом hibernate выполняется дополнительный запрос в таблице колледжа. Невозможно понять, почему. My HQL: 'select student from" + Student.class.getName() + "student where student.college.collegeId = 1' –

+0

Я добавил код моего класса полезности. –

+1

Каковы запросы, выполняемые спящим режимом? Вы можете увидеть их, включив show_sql = true в конфигурации hibernate. –

Смежные вопросы