2012-01-25 4 views
2

у меня есть следующие четыре таблицы:JPA/Hibernate: CriteriaBuilder - Как создать запрос с использованием объекта отношения?

SCHEDULE_REQUEST таблице: ID, APPLICATION_ID (ФК)

ПРИМЕНЕНИЕ ТАБЛИЦА: ID. КОД

USER_APPLICATION ТАБЛИЦА: APPLICATION_ID (FK), USER_ID (FK)

ПОЛЬЗОВАТЕЛЯ ТАБЛИЦА: ID, NAME

Теперь я хотел создать критерии строитель, где условие для выбора 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» неправильно? Пожалуйста, действительно нужна помощь. Спасибо заранее.

ответ

2

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

... 
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

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

+0

Hi perissf. Спасибо за помощь. Но у меня нет классов «ScheduleRequest_», «UserApplication_», «User_». Как мне их создать? А также в вашем псевдокоде вы не указали таблицу «Приложение»? Таблица отношений - таблица USER_APPLICATION, относящаяся к таблицам USER и APPLICATION. Прошу вас посоветуйте. Действительно ценю это. Благодарю. – Jemru

+0

Я видел здесь несколько уроков, но я не уверен, как это сделать в моем случае. http://www.altuure.com/2010/09/23/jpa-criteria-api-by-samples-%E2%80%93-part-ii/ – Jemru

+0

Я обновил свой ответ, добавив некоторые ссылки и добавив третье соединение согласно вашей информации – perissf

Смежные вопросы