【发布时间】:2015-12-23 16:15:12
【问题描述】:
基于this 示例。我尝试使用 Hibernate 和 JPA 注释将 Employee 映射到他的经理。
@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id
@Column(name="EMPLOYEE_ID")
@GeneratedValue
private Long employeeId;
@Column(name="FIRSTNAME")
private String firstname;
@Column(name="LASTNAME")
private String lastname;
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="manager_id")
private Employee manager;
@OneToMany(mappedBy="manager")
private Set<Employee> subordinates = new HashSet<Employee>();
public Employee() {
}
public Employee(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
// Getter and Setter methods
}
我使用休眠标准来编写我的选择请求。问题是,我只想要树中的最高经理,我需要他的下属的集合,他们也知道他们的经理和下属等。
Criteria crit = getCurrentSession().createCriteria(Employee.class, "employee");
crit.add(Restrictions.isNull("manager"))
crit.setResultTransformer(new AliasToBeanTransformer<Employee>(Employee.class));
结果是我要求的正确员工(最高经理),但下属集合为空,如果我尝试更改条件以选择树底部的员工,则映射成功一切。我如何更改我的代码以首先映射最高管理者。我知道我可以从底层开始接触到高层管理者,但是有没有更简洁的方法?
【问题讨论】:
-
您的查询无效。 Employee 类中没有名为“manager_id”的字段。 HQL/Criteria 从不使用表名和列名。他们在实体、他们的领域和他们的协会上工作。所以你想要
crit.add(Restrictions.isNull("employee.manager"))。如何测试下属列表是否为空?向我们展示一个完整的测试用例,带有示例数据。此外, ManyToOne 上的 cascade=ALL 也不正确。您不想在删除员工时删除员工的经理。 -
对不起,我编辑了它。它是“经理”。
-
嗨,jpa CriteraiBuilder 代替 Hobgernate Criteria 怎么样?
标签: java hibernate jpa annotations hibernate-criteria