Hibernate - AttributeConverter和自定义SQL函数

时间:2016-08-24 14:16:26

标签: java hibernate

我试图通过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;
}

这导致了几个问题:

  • ClassCastException ,因为出于某种原因,它将set传递给每个元素AttributeConverter
  • 我尝试将类型从Set<Roles>更改为Object(在转换器中),然后使用 instanceof 我检查它是单个对象还是集合并相应地进行解析。之后我发现,在调用s.roles = :roles工作正常时,调用已注册的bitwise函数甚至没有调用AttributeConverter
  • ResultSet异常,因为在调用bitwise函数并使用带有两个值的输入Set之后,它实际上将?, ?放入查询而不是调用{ {1}},应将其合并为一个数字

问题是,我做错了什么?或者您是否知道更好的问题解决方案:将AttributeParser映射到单个数据库列,同时能够将多个角色分配给一个实体。

例如我的用户值为1,经理值为2,管理员值为4等。我希望某个人同时成为用户和经理,意味着价值3(1 | 2)然后我想通过数字1(相应的2)搜索仅用户(仅限经理)时找到他 - 这表示按位和。

提前感谢您的任何回复!

0 个答案:

没有答案