API критериев: имена столбцов из Root или Join - PullRequest
0 голосов
/ 09 марта 2020

У меня либо 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 {
   //...
}

1 Ответ

0 голосов
/ 10 марта 2020

Лучший вариант инициализации JOINS - использовать метамодель.

В eclipse вы можете активировать автоматическое генерирование c, щелкнув по проекту / properties / JPA / source canonical и выбрав sr c .

Объединение с метамоделью не позволяет вам пересекать таблицы с использованием неправильных полей и выглядит следующим образом:

Join<TraineeSearch, Plans> traineeSearchPlansJoin = root.join(TraineeSearch_.plans, JoinType.INNER);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...