0

以下のように、互いに関連するサンプルデータを含む4つのテーブルがあります

従業員

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

以下は私の対応するポジョです

@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_id が 22 と 33 の dept レコードが返されます。

名前付きクエリとネイティブ SQL クエリを使用して解決策を得ました。しかし、休止状態の CRITERIA を通過できませんでした。誰でもこれで私を助けてもらえますか?

ありがとうハリッシュ

4

1 に答える 1

0

これは .net から Java への直接の翻訳であり、構文が正しいかどうかはわかりませんが、それを回避することはできます (確かではありません。外見からすると、多くの abt 基準を知らないようです。読むことをお勧めします。これは、作成するのが最も簡単なクエリの 1 つだからです)

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

答えは必ずしもあなたのデータモデルに同意することを意味するわけではありません..

于 2012-06-20T07:32:17.267 に答える