我有以下实体关系,我想从 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 查询。理想情况下,我希望拥有designation
and employee_dept
forrequested_by
属性,但是自动生成的查询也会生成designation
and employee_dept
foremp_number
属性,如下面的查询所示。
如何指定生成designation
且employee_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)