在具有一对多关联的两个表上执行Hibernate Join

时间:2013-06-17 22:41:17

标签: java hibernate join hibernate-mapping hibernate-criteria

我基本上有一个包含两个表的数据库,其中包含以下模式:

Employee 

|id|Age|Sex|

Table

|Table_id|Emp_id|Location|

我的employee.hbm.xml文件如下所示:

    <property name="id"
          type="integer"
          column="emp_id" />
    <property name="age"
          type="integer"
          column="age" />
    <property name="sex"
          type="string"
          column="sex" />

我的table.hbm.xml文件如下所示:

    <property name="table_id"
          type="integer"
          column="table_id" />
    <property name="emp_id"
          type="integer"
          column="emp_id" />
    <property name="location"
          type="string"
          column="location" />

我有必要的类与映射,即getter和setter。他们看起来像:

public class EmployeeModel {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id", referencedColumnName="emp_id")

    private int id;
    private int age;
    private String sex;
 //Getters and setters for all the variables


public class TableModel {
@OneToMany(mappedBy="EmployeeModel")

    private int table_id;
    private int emp_id;
    private String location;

    private int table_id;
    private int emp_Id;
    private String location;
 //Getters and setters for all the variables

为了收集返回数据,我创建了一个名为EmployeeTableModel的新类,它看起来像:

public class EmployeeTableModel{
    private int table_id;
    private int emp_id;
    private String location;
    private int table_id;
    private int emp_Id;
    private String location;    
    }

你可以理解,我基本上需要打电话给我一个员工的细节和他所坐的桌子。他们之间有一对一的关联。我理解我的代码有多对一的关联,请在此纠正我。目前,我的疑问是:

List<EmployeeTableModel> data = sess.createCriteria(EmployeeModel.class)
          .setFetchMode("TableModel", FetchMode.JOIN) 
          .add(Restrictions.eq("emp_id", "ANY INPUT"  )).list();

我希望它能给我一个类似的查询:

select e.id,e.age,e.sex,t.table_id,t.emp_id,t.location from employee e, table t;

然而,它反而给了我:

select e.id,e.age,e.sex from employee e;

我在表中添加了一个Employee变量,我更正了查询,使用了HQL,但我仍然无法弄清楚出了什么问题。有人可以告诉我它出了什么问题吗?或者给出替代答案?

1 个答案:

答案 0 :(得分:0)

使用JPA / Hibernate时,尽可能避免在列中思考。想想实体,让框架做出改变。

您的查询仅请求EmployeeModel的列表,因为您执行了

   sess.createCriteria(EmployeeModel.class)

这就是你得到的(你试图将它强制转换为List<EmployeeTableModel>的事实可能会导致编译时警告和运行时错误。

BTW,谈到思考实体,你的模型似乎很误导。您的属性应该是实体(而不是外键);而不是

private int table_id;
private int emp_id;
private String location;
你做了

private int table_id;
private Employee employee;
private String location;

注释似乎也在错误的位置,并且您没有定义ID ...我建议您再次阅读Hibernate文档。