有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在db中存储“hashcode-like”,用于描述布尔类字段,以提高性能并缩短命名查询

这个问题的背景如下:

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

我的想法是为Role类中的所有字段生成一个哈希代码(或类似代码),将命名查询简化为:

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

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

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

这就是第一个问题的背景

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

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    听起来你不需要“散列码”——你只需要一点掩码。只要有32个字段或更少,就可以将其存储为32位整数。如果有64个字段或更少,可以将其存储在64位整数中

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

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

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