【问题标题】:Hide items from collection隐藏收藏中的项目
【发布时间】:2013-02-05 18:47:29
【问题描述】:

我有两节课;

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

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

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    最简单的方法,你可以使用@Where注解。它是 Hibernate 专有注解,我不喜欢专有注解,但它适合您的情况。

    很抱歉旧链接,但在最新的 Hibernate 手册中,我没有找到对此注释的良好解释,尽管它仍然有效。

    【讨论】:

    【解决方案2】:

    您可以使用 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?

    休眠标准

    List users = sess.createCriteria(User.class)
        .createCriteria("roles")
            .add( Restrictions.like("disabled", new Integer(0)))
        .list();
    

    【讨论】:

    • 我忘了说我正在使用 Hibernate Criteria 来查询表,有没有办法使用它来解决它?
    • @MrThys 您在数据库中的布尔值是什么类型?
    • 数字(1)就像你假设的那样
    • @MrThys 您是否通过注释或 xml 设置了映射?如果您设置 sql 以显示正在发出的 sql 命令?
    【解决方案3】:
    1. 您应该通过在User 类中实现角色的访问器方法来封装它。此方法将仅返回启用的角色。这解决了隐藏禁用角色的问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多