- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用带有大量条件的 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/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我正在寻找清理 Grails Controller 代码的方法。在各种 Controller 中我或多或少有相同的逻辑.. 获取对象 检查是否存在 等等.. 是否有建议的方法可以使 Controlle
我真的很喜欢 PHP,因为: _ 易于开发 Web 应用程序(您可以在 10 分钟内设置 LAMP,然后就可以开始了) _ 简单易学 _ 易于部署(您只需要带有 PHP 模块的 Apache) 我真的
我正在尝试使用 mod_rewrite 将我的博客 URL 转换为更适合 SEO 的格式。我所有的文章都存储在一个简单的 MySQL 数据库中。每个博客文章的网址如下所示: http://www.te
我是一名优秀的程序员,十分优秀!