【问题标题】:Performing a Hibernate Join on two tables with a One to Many Association在具有一对多关联的两个表上执行休眠连接
【发布时间】:2013-06-17 22:41:17
【问题描述】:

我基本上有一个数据库,其中包含两个表,其架构如下:

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,但我仍然无法找出问题所在。有人可以告诉我它出了什么问题吗?或者给出一个替代答案?

【问题讨论】:

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


    【解决方案1】:

    使用 JPA/Hibernate 时,尽可能避免在列中思考。考虑实体并让框架进行更改。

    您的查询仅请求EmployeeModel 的列表,因为您这样做了

       sess.createCriteria(EmployeeModel.class)
    

    这就是您所得到的(您尝试将其转换为 List&lt;EmployeeTableModel&gt; 的事实可能会导致编译时警告和运行时错误。

    顺便说一句,谈到考虑实体,您的模型似乎被误导了。您的属性应该是实体(而不是外键);而不是

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

    你会的

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

    注解也出现在错误的地方,而且您没有定义 ID...我建议您再次阅读 Hibernate 文档。

    【讨论】:

    • ID 应该在 .hbm.xml 文件中定义?
    猜你喜欢
    • 2016-09-20
    • 2012-09-10
    • 1970-01-01
    • 2011-09-30
    • 2012-07-08
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多