我正在使用具有許多條件的休眠條件查詢。查詢是否包含由應用程序狀態和角色組成的購買請求表單。因此,爲了簡單起見,所有表單都以狀態1或草稿開始。當表單被保存時,當前用戶成爲創建者。創建者可以將其他用戶指派給表單,例如授權人或聯繫人。這些都是我認爲充滿活力的角色。所以,我的表格的前三個國家都按其次,優化休眠條件查詢以變得更加動態
State 1 "Draft" role Creator
State 2 "Authorizer" role Authorizer
State 3 "Contact" role Contact
一旦你離開的狀態,並進入狀態4,現在的應用程序進入管理角色。表格最終被批准並關閉之前,可能會有多達15個州。直到最後四個州,創作者,授權人和聯繫人將繼續訪問。最後四個州,他們將無法訪問。
除非管理員是創建者,授權者或聯繫人,否則用戶將無法訪問前三個狀態,但將繼續訪問最後一個狀態,包括剩下的四個非管理員也無法訪問。
我目前的查詢看起來像下面這樣,但是作爲管理員,我想不必手動硬編碼每個應用程序狀態以添加到查詢並添加所有這些查詢,但排除管理員不在其中的狀態' t在動態角色創建者,授權者或聯繫人中。
此查詢有效,但非常混亂。
Disjunction programRoles = Restrictions.disjunction();
programRoles.add(Restrictions.eq(Role.ROLE_CREATOR, user));
programRoles.add(Restrictions.eq(Role.ROLE_AUTHORIZER, user));
programRoles.add(Restrictions.eq(Role.ROLE_CONTACT, user));
if(roleManagerService.isAdmin()) {
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.ARCHIVED.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.ASSESSOR_REVIEW.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.ASSIGNOR_REVIEW.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.AUDITOR_REVIEW.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.BURIED.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.DEAD.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.FINAL.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.FINAL_MAJOR_APPROVAL.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.FINAL_MINOR_APPROVAL.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.IFAS_LOAD.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.PO_COLLECTION.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.PO_DISTRIBUTION.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.PO_EVALUATION.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.PURGE.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.SECONDARY_MAJOR_REVIEW.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.SECONDARY_MINOR_REVIEW.name()));
programRoles.add(Restrictions.eq("currentState.prStateCode", ApplicationStateEnum.SECONDARY_OVERHEAD_REVIEW.name()));
}
Criteria results = this.session.createCriteria(PurchaseRequest.class)
.createAlias("currentState", "currentState")
.add(programRoles);
if(!roleManagerService.isAdmin()) {
results.add(Restrictions.ne("currentState.prStateCode", ApplicationStateEnum.DEAD.name()))
.add(Restrictions.ne("currentState.prStateCode", ApplicationStateEnum.ARCHIVED.name()))
.add(Restrictions.ne("currentState.prStateCode", ApplicationStateEnum.FINAL.name()))
.add(Restrictions.ne("currentState.prStateCode", ApplicationStateEnum.BURIED.name()));
}
我想知道如果有人能指出我在清理這個方向,使它更動態。
會要求roleManagerService用於收集 candidateApplicationStates()和集合 excludedApplicationStates()工作?然後,您只需執行Restrictions.in或循環來添加ne。 試圖將這種邏輯放入知道他們是否是管理員並能夠做出決定的類中,您可能會從中受益。嘗試限制該布爾的範圍。 –
roby
@roby,我可以,但所有這些狀態都存放在數據庫中,並且可以動態添加/減少,所以我希望不必硬編碼任何它。我幾乎認爲必須有一種方法來返回管理員的所有結果,除了前三個狀態中不包含當前用戶的結果。我今天似乎無法思考。 –