2012-08-04 11 views
0

的背景,这个问题如下:商店“像哈希码”以dB为布尔类字段的描述以提高性能,并命名查询短

Hash code for expandable class (future proof)

不过,我应该提到我为什么想知道这一点。

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

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

我的想法是让在角色类中的所有领域,这降低了命名查询到对应的哈希码(或类似):

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

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

此外,当我更新角色类与更多角色字段我不需要更新命名的查询。

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

新的问题是:有什么方法可以在Role类中生成一个“hashcode like”字段,该字段是对所有字段是true的描述(即使Role类用更多字段更新)?

在此先感谢

回答

2

这听起来像你并不需要一个“散列码” - 你只需要一个位掩码。只要你有32个或更少的字段,你可以将它存储在一个32位整数中。如果您有64个或更少的字段,则可以将其存储在64位整数中。每个字段都会有一个专用的位 - 所以管理员可以是位0(值1),打印机可以是位1(值2),然后下一个字段是位2(值4)等。将这些值相加(实际上按位或)。

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

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

+0

感谢Jon,我认为你的解决方案将完全适合我的应用。我会去那=) – kungcc 2012-08-04 09:04:59