条件文がたくさんあるHibernate基準クエリを使用しています。アプリケーションの状態と役割で構成される購入要求フォームの場合のクエリ。したがって、物事を単純にするために、すべてのフォームは状態1またはドラフトで開始されます。フォームが保存されると、現在のユーザーが作成者になります。作成者は、承認者や連絡先などの他のユーザーをフォームに割り当てることができます。これらは私が動的な役割と考えるものです。したがって、フォームの最初の3つの状態は次のようになります。
State 1 "Draft" role Creator
State 2 "Authorizer" role Authorizer
State 3 "Contact" role Contact
状態3を離れて状態4に入ると、アプリケーションは管理者の役割になります。フォームが最終的に承認されて締め切られるまでに、最大15の州が存在する可能性があります。最後の4つの状態まで、作成者、承認者、および連絡先は引き続きアクセスできます。最後の4つの状態では、アクセスできなくなります。
管理者が作成者、承認者、または連絡先でない限り、ユーザーは最初の3つの状態にアクセスできませんが、非管理者がアクセスできなかった残りの4つの状態を含め、最後の状態までアクセスできます。それも。
現在のクエリは次のようになりますが、管理者として、クエリに追加する各applicationStateを手動でハードコーディングしてすべてを追加する必要はありませんが、管理者が動的でない状態は除外します。役割の作成者、承認者、または連絡先。
このクエリは機能しますが、非常に面倒です。
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()));
}
誰かがこれをクリーンアップしてよりダイナミックにする方向に私を向けることができるかどうか疑問に思っています。