我有四张表,其中包含相互关联的样本数据,如下所示
员工
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的Dept记录列表。在给出的上述样本数据中,对于EMP_ID = 101,应返回带有dept_ids 22和33的dept记录。
我使用命名查询和本机SQl查询获得了解决方案。但是我不能通过休眠的CRITERIA得到它。有人可以帮我吗?
由于 哈里什
答案 0 :(得分:0)
这是从.net到java的直接翻译,我不确定语法是否正确,但你可以解决它(不确定,从它的外观cos你似乎不知道很多abt标准,我建议阅读abt it,因为这是最简单的查询之一)
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>();
答案并不一定意味着我同意您的数据模型。还可以更改某些成员名称以表示他们真正代表的内容。