JPA / Hibernate: CriteriaBuilder - Как создать запрос, используя объект отношения? - PullRequest
3 голосов
/ 25 января 2012

У меня есть следующие четыре таблицы:

SCHEDULE_REQUEST TABLE: Я БЫ, APPLICATION_ID (FK)

ТАБЛИЦА ЗАЯВКИ: Я БЫ, CODE

USER_APPLICATION TABLE: APPLICATION_ID (FK), USER_ID (FK)

ТАБЛИЦА ПОЛЬЗОВАТЕЛЯ: Я БЫ, ИМЯ

Теперь я хотел создать CriteriaBuilder, где условием является выбор ScheduleRequests для указанных идентификаторов пользователей.

У меня есть следующие коды:

List<User> usersList = getSelectedUsers(); // userList contains users I wanted to select

CriteriaBuilder builder = getJpaTemplate().getEntityManagerFactory().getCriteriaBuilder();
CriteriaQuery<ScheduleRequest> criteria = builder.createQuery(ScheduleRequest.class);
Root<ScheduleRequest> scheduleRequest = criteria.from(ScheduleRequest.class);
criteria = criteria.select(scheduleRequest);

ParameterExpression<User> usersIdsParam = null;
if (usersList != null) {
    usersIdsParam = builder.parameter(User.class);
    params.add(builder.equal(scheduleRequest.get("application.userApplications.user"), usersIdsParam));
}

criteria = criteria.where(params.toArray(new Predicate[0]));

TypedQuery<ScheduleRequest> query = getJpaTemplate().getEntityManagerFactory().createEntityManager().createQuery(criteria);

// Compile Time Error here:
// The method setParameter(Parameter<T>, T) in the type TypedQuery<ScheduleRequest> is not 
// applicable for the arguments (ParameterExpression<User>, List<User>)
query.setParameter(usersIdsParam, usersList);

return query.getResultList();

Не могли бы вы помочь мне, как передать фильтр запроса в объект отношения? Я думаю, что я сделал в "application.userApplications.user" неправильно? Пожалуйста, действительно нужна помощь.

Заранее спасибо!

1 Ответ

2 голосов
/ 25 января 2012

Используя каноническую Метамодель и пару соединений, она должна работать. Попробуйте, если вы получите некоторые подсказки из следующего псевдокода (не проверено):

...
Predicate predicate = cb.disjunction();
if (usersList != null) {
    ListJoin<ScheduleRequest, Application> applications = scheduleRequest.join(ScheduleRequest_.applications);
    ListJoin<Application, UserApplication> userApplications = applications.join(Application_.userApplications);
    Join<UserApplication, User> user = userApplications.join(UserApplication_.userId);
    for (String userName : usersList) {
        predicate = builder.or(predicate, builder.equal(user.get(User_.name), userName));
    }
}

criteria.where(predicate); 
...

Чтобы понять критерии запросов, взгляните на следующие руководства: http://www.ibm.com/developerworks/java/library/j-typesafejpa/ http://docs.oracle.com/javaee/6/tutorial/doc/gjitv.html

Вторая ссылка также должна помочь вам узнать, как использовать классы метамодели, которые должны автоматически создаваться компилятором / IDE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...