2012-01-25 210 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

相關問題