2012-06-20 30 views
0

我有海誓山盟相關的如下標準retriving數據涉及多個聯接

員工

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 

下面是我相應的POJO現在

@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; 

任何人都可以建議我如何檢索部門記錄列表使用給定的EMP_ID CRITERIA。在給出的上述示例數據中,對於EMP_ID = 101,應該返回具有dept_id 22和33的dept記錄。

我得到了使用命名查詢和本地SQl查詢的解決方案。但是我並沒有通過休眠的CRITERIA。任何人都可以在這幫助我嗎?

感謝 哈里什

回答

0

這是一個直接的翻譯從.NET到Java,我不知道,如果語法是正確的,但你可以從它的你似乎沒有看起來它周圍wokr(不知道,COS要知道很多生根粉標準,我建議讀生根粉它這是最簡單的查詢一個寫)

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

答案犯規一定意味着我與您的數據模型一致。還有些成員名稱可以被改變以表示它們真正代表什麼。

+0

但是這會返回Dept對象列表嗎?因爲,我需要檢索Employee表 – user1466661

+0

中給定EMP_ID的Dept記錄列表,因此您需要修改您的投影! – Baz1nga

+0

你可以讓我知道如何做到這一點? – user1466661