【发布时间】:2017-02-22 00:31:07
【问题描述】:
我有一个父实体(公司)和子实体(员工),它们通过 COMPANY_ID 以一对多关系连接。 Company 和 Employee 都有状态栏。
公司实体:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "company")
private List<Employee> employees = new ArrayList<>();
@Column(name = "COMPANY_STATUS")
private String status;
员工实体
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COMPANY_ID", nullable = false)
private Company company;
@Column(name = "EMPLOYEE_STATUS")
private String status;
现在我需要获取所有公司(状态为 HIGH_PROFIT 或 LOW_PROFIT)和员工(状态为 PERMANENT)。我写了一个查询如下。
查询
Criteria criteria = getSession().createCriteria(Company.class);
List<String> statusList = new ArrayList<>();
statusList.add("HIGH_PROFIT");
statusList.add("LOW_PROFIT");
criteria.add(Restrictions.in("status", statusList)).createCriteria("employees").add(Restrictions.eq("status", "PERMANENT"));
criteria.list();
在运行应用程序时,我得到了正确的公司记录,其中员工没有按 PERMANENT 状态过滤,它包含所有具有 CONTRACT 和 PERMANENT 状态的孩子。
在检查休眠日志时,我看到 2 个查询正在执行
1. select this_.id as id1_3_2_, this_.COMPANY_NAME as COMPANY_NAME2_3_2_, this_.COMPANY_STATUS as COMPANY_STATUS3_3_2_, employ1_.id as id1_5_0_, employ1_.EMPLOYEE_STATUS as EMPLOYEE_STA4_5_0_ from COMPANY this_ inner join EMPLOYEE employ1_ on this_.id=employ1_.COMPANY_ID where this_.COMPANY_STATUS in (?, ?) and employ1_.EMPLOYEE_STATUS_ID=?
2. select employ0_.COMPANY_ID as COMPANY_ID5_5_0_, employ0_.id as id1_5_0_, employ0_.EMPLOYEE_STATUS as EMPLOYEE_STA4_5_1_ from EMPLOYEE employ0_ where employ0_.COMPANY_ID=?
我尝试在公司实体的员工变量上使用 @Fetch(FetchMode.SELECT) @Fetch(FetchMode.JOIN) 和 @Fetch(FetchMode.SUBSELECT)(如下面的代码),但没有任何效果。
@OneToMany(cascade = CascadeType.ALL, mappedBy = "company")
@Fetch(FetchMode.SELECT)
private List<Employee> employees = new ArrayList<>();
我也尝试过在子实体上使用别名并在子实体上使用条件。它也没有工作。
有人可以帮我过滤状态正确的孩子吗?
【问题讨论】:
-
在试用别名时,您是否使用了类似于 this 的内容?
-
是的,我做到了。它给了我所有的记录。
标签: hibernate join subquery children