【问题标题】:Criteria for retriving data involving multiple joins检索涉及多个关节的数据的标准
【发布时间】:2012-06-22 07:05:05
【问题描述】:

我有四个表,其中的示例数据如下所示

员工

EMP_ID|EMP_NAME
---------------
101   |John

EmployeeDtl

EMP_DTL_ID  |EMP_SKILLS |EMP_ID
-----------------------------------
1001        |Java       |101
1002        |SQL        |101

EmpDeptDtl

EMP_DTL_ID  |DEPT_ID
--------------------
1001        |22
1002        |33

部门

DEPT_ID |DEPT_NAME
----------------------
22      |XYZ
33      |PQR

下面是我对应的pojos

@Entity
public class Employee {
   private static final long serialVersionUID = 1L;

   @Id
   @Column(name="EMP_ID")
   private Long empId;

   @Column(name="EMP_NAME")
   private String empName;

   //bi-directional many-to-one association to EmployeeDtl 
   @OneToMany(mappedBy="employee", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
   private Set<EmployeeDtl> empDtls;


@Entity
@Table(name="EMP_DTL")
public class EmployeeDtl {

   @Id
   @Column(name="EMP_DTL_ID")
   private Long empDtlId;

   @Column(name="EMP_GRP")
   private String employeeGrp;


   //bi-directional many-to-one association to Employee 
    @ManyToOne
   @JoinColumn(name="EMP_ID")
   private Employee employee;

    @Column(name="EMP_ID", insertable=false, updatable=false)
   private Long empId;

   //bi-directional many-to-one association to EmpDeptDtl
   @OneToMany(mappedBy="id.empDtlId", cascade= CascadeType.ALL)
   private Set<EmpDeptDtl> empDeptDtls;



@Entity
public class EmpDeptDtl {

   @EmbeddedId
   private EmpDeptDtlPK id;

   @Column(name="EMP_DTL_ID", insertable = false, updatable = false)
   private Long empDtlId;

   //bi-directional many-to-one association to Dept
    @ManyToOne(fetch=FetchType.LAZY)
   @JoinColumn(name="DEPT_ID", insertable = false, updatable = false)
   private Dept deptId;



@Embeddable
public class EmpDeptDtlPK implements Serializable {
   //default serial version id, required for serializable classes.
   private static final long serialVersionUID = 1L;

   @Column(name="DEPT_ID")
   private Long deptId;

   //bi-directional many-to-one association to EmpDeptDtl
    @ManyToOne(fetch=FetchType.LAZY)
   @JoinColumn(name="EMP_DTL_ID")
   private EmployeeDtl employeeDtl;


@Entity
public class Dept  {

   @Id
   @Column(name = "DEPT_ID")
   private Long deptId;

   @Column(name = "DEPT_NAME")
   private String deptName;

        // bi-directional many-to-one association to EmpDeptDtl 
   @OneToMany(mappedBy = "deptId")
   private Set<EmpDeptDtl> empDeptDtls;

现在,谁能建议我如何使用 CRITERIA 检索给定 EMP_ID 的部门记录列表。在上面给出的示例数据中,对于 EMP_ID=101,应返回 dept_ids 为 22 和 33 的部门记录。

我使用命名查询和原生 SQl 查询获得了解决方案。但我无法通过休眠标准得到它。有人可以帮我吗?

谢谢 哈里什

【问题讨论】:

    标签: hibernate criteria one-to-many many-to-one


    【解决方案1】:

    这是从 .net 到 java 的直接翻译,我不确定语法是否正确,但您可以围绕它进行操作(不确定,因为从外观上看,您似乎不太了解 abt 标准,我建议阅读 abt 它,因为这是最容易编写的查询之一)

    session.createCriteria(Employee.class,"emp")
    .createAlias("emp.empDtls","empDetail")
    .createAlias("empDetail.empDeptDtls","empDetail")
    .createAlias("empDetail.deptId","dept")
    .add(Restrictions.Eq("emp.empId", 101))
    .setProjection(projections.property("dept.deptId"))
    .toList<long>();
    

    答案并不一定意味着我同意你的数据模型。还有一些成员名称可以更改以表示它们真正代表的内容..

    【讨论】:

    • 但这会返回 Dept 对象列表吗?因为,我需要在 Employee 表中检索给定 EMP_ID 的 Dept 记录列表
    • 你需要为此修改你的投影!
    • 你能告诉我怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2018-08-03
    • 2017-05-28
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多