gpt4 book ai didi

java - 优化 hibernate criteria 查询变得更加动态

转载 作者:行者123 更新时间:2023-12-01 14:52:09 25 4
gpt4 key购买 nike

我正在使用带有大量条件的 hibernate 标准查询。查询是否包含应用程序状态和角色的购买请求表单。因此,为了简单起见,所有表单都以状态 1 或草稿开始。保存表单后,当前用户将成为创建者。创建者可以将其他用户分配给表单,例如授权者或联系人。这些是我认为的动态角色。所以我的表格的前三个状态如下,

State 1 "Draft" role Creator
State 2 "Authorizer" role Authorizer
State 3 "Contact" role Contact

一旦离开状态 3 并进入状态 4,应用程序现在就进入管理员角色。在该表格最终获得批准和关闭之前,可能需要经过多达 15 个州的批准。在最后四个状态之前,创建者、授权者和联系人将继续具有访问权限。最后四个州,他们将无权访问。

除非管理员是创建者、授权者或联系人,否则用户将无权访问前三个状态,但将继续有权访问直到最后一个状态,包括非管理员无法访问的其余四个状态也没有访问权限。

我当前的查询如下所示,但是作为管理员,我希望不必手动硬编码要添加到查询中的每个 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()));
}

我想知道是否有人可以给我指出一个方向来清理它,使其更加动态。

最佳答案

我还没有真正尝试过,但也许只是添加了管理员用户不允许看到的限制。像这样的东西:

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

关于java - 优化 hibernate criteria 查询变得更加动态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14736669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com