【问题标题】:Hibernate Criteria : selection from two tables with Foreign key relationship?Hibernate Criteria:从具有外键关系的两个表中选择?
【发布时间】:2012-08-15 15:14:43
【问题描述】:

我的 mysql 数据库中有 2 个表:

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

学生表有一个外键,即teacher'sid,它引用了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;
}

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

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。

提前致谢!

【问题讨论】:

    标签: mysql hibernate hibernate-criteria


    【解决方案1】:
    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();
    

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

    【讨论】:

    • 我是怎么做到的?像:学生学生?如果我这样做,我必须更改 hibernate.cfg.xml 中的映射?我将其设置为
    • 您需要 Teacher.java 中的以下属性 @OneToMany(targetEntity=Student.class,cascade=CascadeType.ALL,mappedBy="teacher") @Cascade(value=org.hibernate.annotations.CascadeType. ALL) private Collection students = new ArrayList();您需要 Student.java @ManyToOne @JoinColumn(name="colg_id") 私立大学学院的以下属性;您需要在两个类中都有这些属性的 setter 和 getter。
    • 第一行不是session.createCriteria吗?
    • 是的..它是 session.createCriteria
    • 当我尝试编译它时它说:类型不匹配:无法从 CascadeType 转换为 CascadeType[]
    【解决方案2】:

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

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

    一旦您正确修改了实体,hibernate 就会自动在表之间发出连接。

    【讨论】:

    【解决方案3】:

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

    我认为这对你有用:

    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) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多