У меня есть родительское сущность (компания) и дочернее сущность (Employee), к которому присоединяется одно-много отношений от COMPANY_ID. У компании и сотрудника есть столбец статуса.Сброс настроек дочернего объекта спящего режима Неправильный ребенок
CompanyEntity:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "company")
private List<Employee> employees = new ArrayList<>();
@Column(name = "COMPANY_STATUS")
private String status;
Сотрудник Entity
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COMPANY_ID", nullable = false)
private Company company;
@Column(name = "EMPLOYEE_STATUS")
private String status;
Теперь мне нужно, чтобы извлечь все компании (чей статус в HIGH_PROFIT или LOW_PROFIT) и сотрудники (кто статус ПОСТОЯННЫЙ). Я написал запрос, как показано ниже.
Запрос
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();
На запуске приложения, я получаю правильные записи компании, где, как работник не фильтруется ПОСТОЯННОГО статуса, он содержит все дети как с КОНТРАКТА и постоянного статуса.
При проверке журналов Hibernate, я вижу 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<>();
Я также попытался использовать псевдоним для дочернего объекта и использовать условие для дочернего элемента. Это тоже не сработало.
Может ли кто-нибудь помочь мне в фильтрации ребенка с правильным статусом?
для три- al с псевдонимом вы использовали что-то похожее на [this] (http://stackoverflow.com/a/29457393/1910582)? –
Да, я это сделал. И это дало мне все записи. – Maz