如何使用Criteria API编写以下查询

时间:2014-12-23 14:42:56

标签: hibernate hql criteria

我是新手,我已阅读文档,在我看来,它并没有完全展示如何从初学者的角度来做这些。所示的示例仅显示最多来自一个或两个表的示例。任何帮助都将非常感激。

SELECT EMPP.empid, EMPP.firstName, EMPP.middleName, EMPP.lastName, EMPJ.jobTitle, 
       EMPJ.status, EMPJ.department, EMPR.manager 
FROM   Emp_PersonalDetails EMPP 
JOIN   Emp_JobDetails EMPJ 
ON     EMPP.EMPID = EMPJ.EJDID 
JOIN   Emp_Reporting EMPR 
ON     EMPP.EMPID = EMPR.RDID 
WHERE  EMPP.firstName LIKE :name 
OR     EMPP.empid LIKE:id

1 个答案:

答案 0 :(得分:0)

假设您有一个Emp_PersonalDetails类,其中一个名为“reporting”的关联引用了一个Emp_Reporting类的实例,那么类似下面的内容应该有效。 请注意,我已经为你喜欢的条件使用了nameVar和empIdVar。 另请注意,这将返回Emp_PersonalDetails的实例,但会同时获取Emp_Reporting。您必须通过返回的Emp_PersonalDetails实例访问Emp_Reporting。

session.createCriteria( Emp_PersonalDetails.class )
       .setFetchMode( "reporting", FetchMode.JOIN )
       .setFetchMode( "details", FetchMode.JOIN )
       .add( Restrictions.like( "firstName", nameVar ))
       .add( Restrictions.like( "empid", empIdVar ))

你的Hibernate映射看起来像:

<class name="example.Emp_PersonalDetails" table="...">
  <id name="empid" column="empid" ...>
  <property name="firstName" ...>
  ...
  <one-to-one name="reporting" class="example.Emp_Reporting" lazy="proxy"...>
  <one-to-one name="details"  class="example.Emp_JobDetails" lazy="proxy" ...>
</class>

<class name="example.Emp_Reporting" ...>
  <id name="id" ...>
    <column="rdid" />
    <generator class="foreign">
      <param name="property">emp</param>
    </generator>
  </id>
  <one-to-one name="emp" class="example.Emp_PersonalDetails" constrained="true" />
  <property name="manager" ...>
  ...
</class>

<class name="example.Emp_JobDetails"...>
  <id name="id" ...>
    <column="rdid" />
    <generator class="foreign">
      <param name="property">emp</param>
    </generator>
  </id>
  <one-to-one name="emp" class="example.Emp_PersonalDetails" constrained="true" />
  <property name="jobTitle" ...>
  ...
</class>