将"hashcode like"存储在数据库中,用于描述布尔类字段,以提高性能并使命名查询简短



这个问题的背景如下:

可扩展类(经得起未来考验)的哈希码

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

我有一个包含许多角色(布尔字段)的类。我不想像那样进行命名查询(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类中生成一个"类似哈希码"的字段,该字段是对所有字段的真实描述(即使Role类更新了更多字段)?

提前感谢

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

然后,每个字段都有一个专用的位,因此admin可以是位0(值1),printer可以是位1(值2),然后下一个字段将是位2(值4)等。只需将值相加(实际上是按位OR)。

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

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

最新更新