0

这个问题的背景如下:

可扩展类的哈希码(面向未来)

但是,我应该提一下为什么我想知道这一点。

我有一个具有许多角色(布尔字段)的类。我不想进行命名查询(JPA)之类的

@NamedQuery(name= "searchUserWithRoles", query="SELECT u FROM User u WHERE u.role.admin = :admin AND u.role.printer = :printer AND ... .. . .+ 20 more booleans...)

我的想法是为 Role 类中的所有字段创建一个哈希码(或类似的),从而将命名查询减少为:

@NamedQuery(name= "searchUserWithRoles", query="SELECT u FROM User u WHERE u.role.hashcode = :hashcode)

我认为(但我不确定)这会提高性能,但也会使我的查询非常短(我的用户类中有一个更像“角色”的字段)。

此外,当我使用更多角色字段更新 Role 类时,我不需要更新命名查询。

这就是第一个问题的背景。

新问题是:是否有某种方法可以在 Role 类中生成一个“hashcode like”字段,该字段是对所有真实字段的描述(即使 Role 类更新了更多字段)?

提前致谢

4

1 回答 1

2

听起来您不需要“哈希码”-您只需要一个位掩码。只要您有 32 个或更少的字段,就可以将其存储在 32 位整数中。如果您有 64 个或更少的字段,则可以将其存储在 64 位整数中。

然后每个字段将有一个专用位 - 因此管理员可以是位 0(值 1),打印机可以是位 1(值 2),然后下一个字段将是位 2(值 4)等等。只需将这些值相加(实际上是按位或)。

然后查询任何特定组合,您只需在数据和仅设置相关位的“掩码”之间使用按位与。因此,如果您想查找每个没有打印机权限的管理员,您需要检查value & 3 == 1.

请注意,所有这些都可能会干扰数据库想要执行的任何索引,并且数据库可能会以这种方式进行优化。您是否有任何证据表明将它们存储为单独的字段 - 使您的表示更接近您的逻辑数据结构 - 实际上会导致问题?

于 2012-08-04T08:37:54.117 回答