2013-02-06 65 views
0

我正在使用具有許多條件的休眠條件查詢。查詢是否包含由應用程序狀態和角色組成的購買請求表單。因此,爲了簡單起見,所有表單都以狀態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())); 
       } 

我想知道如果有人能指出我在清理這個方向,使它更動態。

+0

會要求roleManagerService用於收集 candidateApplicationStates()和集合 excludedApplicationStates()工作?然後,您只需執行Restrictions.in或循環來添加ne。 試圖將這種邏輯放入知道他們是否是管理員並能夠做出決定的類中,您可能會從中受益。嘗試限制該布爾的範圍。 – roby

+0

@roby,我可以,但所有這些狀態都存放在數據庫中,並且可以動態添加/減少,所以我希望不必硬編碼任何它。我幾乎認爲必須有一種方法來返回管理員的所有結果,除了前三個狀態中不包含當前用戶的結果。我今天似乎無法思考。 –

回答

1

我還沒有真正嘗試過,但也許只能添加管理員用戶不允許看到的限制。 喜歡的東西:

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)); 

// change starts here 
if(roleManagerService.isAdmin()) { 
    Conjunction notHiddenStateForAdmin = Restrictions.conjunction(); 
    notHiddenStateForAdmin.add(Restrictions.ne("currentState.prStateCode", ApplicationStateEnum.FIRST_STATE.name())); 
    notHiddenStateForAdmin.add(Restrictions.ne("currentState.prStateCode", ApplicationStateEnum.SECOND_STATE.name())); 
    notHiddenStateForAdmin.add(Restrictions.ne("currentState.prStateCode", ApplicationStateEnum.THIRD_STATE.name())); 
    programRoles.add(notHiddenStateForAdmin); 
} 

// rest unchanged 
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())); 
} 
+1

Klein-Robbenha您的解決方案唯一的問題是,一旦我們經過第三個狀態並進入第四個狀態,它僅向我提供包含我作爲創建者,授權者或聯繫人的結果。一旦處於第四狀態,我將需要與所有用戶見面,例如,如果John doe是創建者,授權者和聯繫人,那麼如果表單處於任何這些狀態,我都不應該看到他,但一旦它它出於這些國家,我應該看到作爲管理員的結果。我應該看到這些州的任何結果的唯一時間是如果我被分配到其中的一個。 –

+0

好的,回到修改板...嗯,而不是創建一個新的答案我編輯我的原始的一個,所以它現在只過濾從管理員「禁止」的初始狀態(不知道什麼thir名稱,所以他們是FIRST_STATE ...等等)。希望這個效果更好。 (順便說一句,我應該創建一個新的答案,而不是編輯編輯?我不知道什麼是適當的行爲,因爲我在這裏是很新的) –

+0

謝謝,迄今它似乎工作。我今天下午通過我們的測試人員運行它。提供沒有錯誤,我會投票給你最好的答案。感謝所有的幫助。 –