У меня либо Root
, либо Join
в качестве root запроса Criteria API.
// A possible variable FROM (either Root or Join, both derive from it)
From from = null;
// Case 1
Root<TraineeSearch> root = criteriaQuery.from(TraineeSearch.class);
from = root;
// Case 2: conditionally join on PLANS_T
if (!StringUtils.isBlank(criteria.getOptionalString())) {
Join<TraineeSearch, Plans> traineeSearchPlansJoin = root.join("plans", JoinType.INNER);
from = traineeSearchPlansJoin;
}
Вы можете видеть, что я запрашиваю прямо на TraineeSearch
или в соединении между TraineeSearch & Plans
. Таблица 1 присутствует всегда.
Затем мне нужно проверить некоторые столбцы, которые находятся в TraineeSearch
(Таблица 1), чтобы они всегда были доступны. Я делаю это на from
, который получен из этой точки.
Predicate where = cb.conjunction();
// These are Table 1 columns, always present
where = cb.and(where, cb.or(cb.equal(from.get("active"), true),
cb.isNotNull(from.get("currentPlan"))));
Когда у меня есть JOIN, моя ошибка:
Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute
with the the given name [active] on this ManagedType [app.domain.Plans]
Нужен ли мне псевдоним вид? Но тогда как мне написать мой предикат Where в общем?
Обновление
Конечный SQL должен быть либо
(1) select .. from trainee_search_vw where current = 'Y'
или
(2) select .. from trainee_search_vw ts, plans_t p where ts.current = 'Y'
(для (2) в соединении будут другие поля Plans
, но давайте сначала исправим немедленную ошибку в столбце таблицы 1 )
Поля, такие как current
, всегда включены.
Доменные объекты:
@Entity
@Table(name = "TRAINEE_SEARCH_VW")
public class TraineeSearch {
//...
private List<Plans> plans;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "TRAINEE_NED_ID", referencedColumnName = "NED_ID")
public List<Plans> getPlans() {
return plans;
}
public void setPlans(List<Plans> plans) {
this.plans = plans;
}
}
@Entity
@Table(name = "PLANS_T")
public class Plans {
//...
}