-2

我有以下实体关系,我想从 Employee 类中获取员工详细信息。

实体代码片段

   @Entity
   public class Project
   @ManyToOne
   @JoinColumn(name = "EMPLOYEE_NUMBER", referencedColumnName = "EMPLOYEE_NUMBER")
   private Employee empNumber;

   @ManyToOne
   @JoinColumn(name = "REQUESTED_BY", referencedColumnName = "EMPLOYEE_NUMBER")
   private Employee requestedBy;
   }   

   @Entity
   public class Employee {
   @OneToMany(mappedBy = "empNumber")
   private Set<Project> employees;

   @OneToMany(mappedBy = "requestedBy")
   private Set<Project> employeeRequestedBy;
   }

DAOImpl代码片段

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Project> c = cb.createQuery(Project.class);
Root<Project> project = c.from(Project.class);
project.fetch(Project_.empNumber, JoinType.LEFT);
project.fetch(Project_.requestedBy, JoinType.LEFT);
c.orderBy(cb.desc(project.get("projectId")));
c.select(project);

CriteriaQuery<Long> countQ = cb.createQuery(Long.class);
Root<Project> projectCount = countQ.from(Project.class);
countQ.select(cb.count(projectCount));

List<Predicate> criteria = new ArrayList<Predicate>();
if (projectId != null) {
ParameterExpression<String> pexp = cb.parameter(String.class,
 "projectId");
Predicate predicate = cb.equal(project.get(Project_.projectId), pexp);
criteria.add(predicate);
            }

TypedQuery<Project> q =  entityManager.createQuery(c);

当我运行我的应用程序时,它会生成以下 sql 查询。理想情况下,我希望拥有designationand employee_deptforrequested_by属性,但是自动生成的查询也会生成designationand employee_deptforemp_number属性,如下面的查询所示。

如何指定生成designationemployee_dept仅用于requested_by属性?任何帮助都是非常可观的。

SELECT    *
      FROM    (SELECT project0_.project_id AS project1_2_0_,
                      employee1_.emp_number AS emp1_1_1_,
                      employee2_.emp_number AS emp1_1_2_,                            
                      project0_.date_requested AS date7_2_0_,
                      employee1_.employee_dept AS employee5_1_1_,
                      employee1_.designation AS designat6_1_1_,
                      employee1_.employee_name AS employee7_1_1_,
                      employee2_.employee_dept AS employee5_1_2_,
                      employee2_.designation AS designat6_1_2_,
                      employee2_.employee_name AS employee7_1_2_
                      FROM    projects project0_
                      LEFT OUTER JOIN employees employee1_
                      ON project0_.emp_number = employee1_.emp_number
                      LEFT OUTER JOIN employees employee2_
                      ON project0_.requested_by = employee2_.emp_number                            
                      ORDER BY    project0_.project_id DESC)

我的预期查询是

SELECT    *
      FROM    (SELECT project0_.project_id AS project1_2_0_,
                      employee1_.emp_number AS emp1_1_1_,
                      employee2_.emp_number AS emp1_1_2_,                            
                      project0_.date_requested AS date7_2_0_,
                      employee1_.employee_name AS employee7_1_1_,
                      employee2_.employee_dept AS employee5_1_2_,
                      employee2_.designation AS designat6_1_2_,
                      employee2_.employee_name AS employee7_1_2_
                      FROM    projects project0_
                      LEFT OUTER JOIN employees employee1_
                      ON project0_.emp_number = employee1_.emp_number
                      LEFT OUTER JOIN employees employee2_
                      ON project0_.requested_by = employee2_.emp_number                            
                      ORDER BY    project0_.project_id DESC)
4

1 回答 1

1

您告诉 JPA 获取 Project 及其引用的员工,因此它需要返回完整的实体,否则会破坏上下文。我不知道 Hibernate 如何/是否支持惰性基本映射,但这可能是一种选择 - 将 Employee 中您并不总是想要的属性标记为惰性。这将同样影响 requestedBy 和 empNumber 关系。

如果您不想要完整的 Employee 数据,您可以让查询只返回您想要的数据。保留查询以获取 empNumber,但使 requestBy 关系变得惰性,并让查询返回 Project 和您想要的 Project_.requestedBy 数据。Linda 在https://blogs.oracle.com/ldemichiel/entry/the_typing_of_criteria_queries有一个使用多选返回数据的好例子。

于 2013-08-27T13:11:49.570 回答