2012-01-25 195 views
2

我有以下四个表:JPA/Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?

SCHEDULE_REQUEST TABLE: ID, APPLICATION_ID(FK)

应用表: ID。 CODE

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

用户表: ID, NAME

现在我想创造条件建设者WHERE条件为指定的用户ID选择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

使用规范Metamodel和一些连接,它应该工作。如果从下面的伪代码(未测试)得到一些提示尝试:

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

嗨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

相关问题