我试图通过Hibernate将EnumSet映射为单个值为整数。
我已经实现了AttributeConverter:
public class RolesToIntConverter implements AttributeConverter<Set<Roles>, Integer> {
@Override
public Integer convertToDatabaseColumn(Set<Roles> attribute) {
return Roles.encode(attribute);
}
@Override
public Set<Roles> convertToEntityAttribute(Integer dbData) {
return Roles.decode(dbData);
}
}
以及新的SqlDialect:
public class LocalSqlDialect extends MySQL5Dialect {
public LocalSqlDialect() {
super();
registerFunction("bitwise_and", new SQLFunctionTemplate(IntegerType.INSTANCE, "(?1 & ?2)"));
}
}
然后我称之为:
public Collection<PersonsEntity> getAll(Roles roles) {
Query q = getEntityManager().createQuery("SELECT s FROM PersonsEntity AS s WHERE ( bitwise_and(s.roles,:roles) <> 0 )");
q.setParameter("roles", EnumSet.of(roles));
List<PersonsEntity> result = (List<PersonsEntity>) q.getResultList();
return result;
}
这导致了几个问题:
AttributeConverter
Set<Roles>
更改为Object
(在转换器中),然后使用 instanceof 我检查它是单个对象还是集合并相应地进行解析。之后我发现,在调用s.roles = :roles
工作正常时,调用已注册的bitwise
函数甚至没有调用AttributeConverter
bitwise
函数并使用带有两个值的输入Set
之后,它实际上将?, ?
放入查询而不是调用{ {1}},应将其合并为一个数字 问题是,我做错了什么?或者您是否知道更好的问题解决方案:将AttributeParser
映射到单个数据库列,同时能够将多个角色分配给一个实体。
例如我的用户值为1,经理值为2,管理员值为4等。我希望某个人同时成为用户和经理,意味着价值3(1 | 2)然后我想通过数字1(相应的2)搜索仅用户(仅限经理)时找到他 - 这表示按位和。
提前感谢您的任何回复!