Hibernate Criteria:从具有外键关系的两个表中选择?

时间:2012-08-20 09:25:33

标签: mysql hibernate criteria-api hibernate-criteria

我的mysql数据库2表:

1.teacher(id(pk),name,phone,email)
2.student(id(pk),teacher'sid(FK),name,phone,email)

学生表中有一个外键,老师的名字,对于teacher.id。

我想选择他们的id(teachers.id)与(student.teacher'sid)相同的老师,其中student.name =“Steven”。

我创建了两个具有与表相同的类名和属性的类,并且我已经配置了映射。

@Entity
class teacher {
@Id
int id;
String name;
String phone;
String email;
}

@Entity
class student {
@Id
int id;
int teachersid;
String name;
String phone;
String email;
}

我可以通过以下方式选择他的名字是“史蒂文”的学生:

Criteria q = session.createCriteria(student.class).add(
                Restrictions.eq("name", "stevens"));

如何审视“史蒂文”的老师? 像

这样的东西
(select * from teacher(where teacher.id = student.teachersid(where student.name="stevens")))

,但是使用Hibernate Criteria Api。

提前致谢!

3 个答案:

答案 0 :(得分:6)

Criteria c = s.createCriteria(Teacher .class,"tchr");
c.createCriteria("students", "s");//Teacher class should contain students collection
c.add(Restrictions.eq("s.name", "Ashok"));
List l=c.list();

希望这会对你有所帮助。如果您有任何问题,请告诉我。

答案 1 :(得分:0)

您的Hibernate实体类未正确反映表之间的关系。 Student实体应该看起来类似于

@Entity
class student {
@Id
int id;
teacher teach;
String name;
String phone;
String email;
}

正确修改实体后,hibernate会自动在表之间发出连接。

答案 2 :(得分:0)

我认为最简单的方法是使用教师实体作为主要实体并应用sqlRestriction来过滤此表。 我认为你不能直接从Students课程中使用标准和限制,因为你要检索的是教师实体,而且这个方向教师没有映射 - >学生。

我认为这对你有用:

Criteria q = session.createCriteria(teacher.class)
          .add( Restrictions.sqlRestriction("exists (select 1 
                from student_table s where    s.teachersid = {alias}.id 
                and s.student_name=?", "stevens", Hibernate.STRING) )