隐藏集合中的项目

时间:2013-02-05 10:33:17

标签: java hibernate hibernate-criteria

我有两节课;

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

有没有办法查询用户表并使用此查询来“隐藏”他/她在我运行查询后应该处理的角色集中的已禁用角色?

3 个答案:

答案 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)

  1. 您应该通过将角色的访问器方法实现到User类来封装它。此方法仅返回已启用的角色。这解决了隐藏已禁用角色的问题。

  2. 其他问题是从所有用户的角色列表中禁用后删除角色。你可以这样做。创建负责用户/角色相关操作的特殊服务/经理。实现执行以下操作的方法disableRole():禁用角色,然后遍历所有用户并从角色列表中删除角色。但要小心:在这种情况下,一旦再次启用角色,角色就不会自动出现在用户列表中。所以,我只实现了第一个想法(见上文)。