【发布时间】:2016-04-01 18:04:03
【问题描述】:
我有以下课程:
Company.class:
public class Company {
@JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "company_id") , inverseJoinColumns = @JoinColumn(name = "employee_id") )
@ManyToMany(fetch = FetchType.LAZY)
private Set<Employee> employees;
@Column(name = "score")
private BigDecimal score;
}
和Employee.class
public class Employee {
@ManyToMany(fetch = FetchType.EAGER, mappedBy="employees")
private Set<Company> companies;
}
Company 的 Score 列在 db 中始终为空,并且从未通过 dao 更新,因为对于每个唯一的 Company-Employee 对,还有其他包含 score 的表。 我需要 Score 的值,仅适用于我通过 id 获取 Employee 的情况,因此在这种情况下,Set 中的所有 Company 实例都应该包含 score,因此我将获得 Employee-Company 分数对,其中员工是 Employee。 我有以下代码来实现这一点:
public Employee get(Long id) {
Employee emp = (Employee) dao.find(id);
List<Company> compList = compnanyService.getByEmpId(id);
Set<Company> compSet = new HashSet<Company>(compList);
emp.setCompanies(compSet);
return emp;
}
公司道包含方法:
public List<Company> getByEmpId(Long id) {
final Query query = this.entityManager.createNativeQuery("select company.comp_id, ...some other fields, score.score from company join score on company.company_id=score.company_id where score.employee_id=:employee_id",
Company.class);
query.setParameter("employee_id", id);
List<Company> comps = query.getResultList();
return comps;
}
问题在于getByEmpId(id) 给出了ResultList,其中company.score 为空,尽管在数据库中执行它不为空。
我怀疑有一些缓存介入,所以我尝试从本机查询中删除一些列,它应该在映射时调用异常并显示“未找到列”(或类似)消息,但这种方法仍然给出List<Company> 尽管 Hibernate 会在控制台中打印出我的本机查询以及我所做的所有更改,但所有字段都在其位置。
我在这里做错了什么以及如何实现我的需要?谢谢。
【问题讨论】:
-
如果员工和公司之间已经有双向@ManyToMany,为什么还要使用本机查询从员工ID中检索相关公司?看来您不需要它。
-
因为分数存储在不同的表中,我需要加入来检索它。还有其他方法吗?
-
您有一个员工实体,其中包含与该员工相关的公司实体列表:Set
公司;如果您能够通过其 id 找到 Employee 实体,则您已经拥有该 Employee 的相关公司实体。出于这个原因,我不明白您为什么要在公共 Employee get(Long id) {..} 方法中从数据库中检索公司实体列表。 -
我更改了帖子的文字以使其更清晰。请再读一遍。请注意原生 SQL 查询的文本。它使用 join 将 Company 的 score 字段替换为 Score 的 score 字段。抱歉,我不知道如何进一步提高清晰度。
标签: java mysql hibernate jpa nativequery