【问题标题】:How do I write the following query using the Criteria API如何使用 Criteria API 编写以下查询
【发布时间】:2015-02-21 17:25:56
【问题描述】:

我是新手,我已经阅读了文档,但我认为从初学者的角度来看,它并没有完全展示如何做到这一点。显示的示例最多仅显示来自单个或两个表的示例。任何帮助将不胜感激。

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

【问题讨论】:

    标签: hibernate hql criteria


    【解决方案1】:

    假设您有一个 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>
    

    【讨论】:

    • 在这个查询中我需要访问三个表。第三个是“Emp_JobDetails”。我试过这个,我得到了以下异常: 引起:org.hibernate.QueryException:无法解析属性:empid:org.charles.periodic.metals.beans.Emp_PersonalDetails
    • 我没有看到您的最后一次编辑。只需添加另一个 setFetchMode(),它将告诉 Hibernate 在检索结果时获取 JobDetails。这假设 JobDetails 可通过“详细信息”关系获得。
    • 好的,谢谢。这些表通过主键以一对一的关系连接。该数据库是一个 HR 数据库,将员工详细信息存储在 8 个表中,每个表有 8 到 12 列。每个表在下一个表中只有一条记录。我已经设法将 Hibernate 设置为自动创建表并通过主键加入它们。那么我是否应该将您提到的“报告”关联替换为下一张表的ID等等......?谢谢
    • 什么是 Hibernate 映射?我将使用可能的主键映射来编辑响应。
    • code @OneToOne(mappedBy = "details", cascade = CascadeType.ALL) private Emp_ContactDetails contactDetails; @OneToOne(mappedBy = "details", cascade = CascadeType.ALL) private Emp_EmergencyContacts emgContactDetails; code
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 2022-01-15
    • 2011-06-05
    • 2013-08-20
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多