我有两节课;
User {
private String name;
private Set<Role> roles;
}
Role {
private String name;
private boolean disabled;
}
在我的应用程序中,用户可以分配多个角色,这些角色存储在角色集中。 可能会发生角色被禁用且用户无法再查看的情况。
我正在使用Hibernate Criteria来查询表格;
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("name", name));
有没有办法查询用户表并使用此查询来“隐藏”他/她在我运行查询后应该处理的角色集中的已禁用角色?
答案 0 :(得分:1)
您可以使用HQL执行inner join。
<强> HQL 强>
SELECT u FROM User u JOIN u.roles r WHERE r.disabled = 0
这假设您已将boolean
设置为映射到Number(1)
类型的列
What does Hibernate map a boolean datatype to when using an Oracle database by default?
Hibernate标准
List users = sess.createCriteria(User.class)
.createCriteria("roles")
.add( Restrictions.like("disabled", new Integer(0)))
.list();
答案 1 :(得分:1)
最简单的方法是,您可以使用@Where注释。它是Hibernate专有的注释,我不喜欢专有注释,但它适合你的情况。
对于旧的链接很抱歉,但在最新的Hibernate手册中,我找不到这个注释的好解释,尽管它仍然有效。
答案 2 :(得分:0)
您应该通过将角色的访问器方法实现到User
类来封装它。此方法仅返回已启用的角色。这解决了隐藏已禁用角色的问题。
其他问题是从所有用户的角色列表中禁用后删除角色。你可以这样做。创建负责用户/角色相关操作的特殊服务/经理。实现执行以下操作的方法disableRole()
:禁用角色,然后遍历所有用户并从角色列表中删除角色。但要小心:在这种情况下,一旦再次启用角色,角色就不会自动出现在用户列表中。所以,我只实现了第一个想法(见上文)。