gpt4 book ai didi

java - 将 "hashcode like"存储在数据库中作为 boolean 类字段的描述,以提高性能并使命名查询简短

转载 作者:行者123 更新时间:2023-12-02 07:39:13 25 4
gpt4 key购买 nike

这个问题的背景如下:

Hash code for expandable class (future proof)

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

我有一个具有许多角色( boolean 字段)的类。我不想进行命名查询(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 位整数中。

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

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

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

关于java - 将 "hashcode like"存储在数据库中作为 boolean 类字段的描述,以提高性能并使命名查询简短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11807139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com