java - 将枚举集合映射到单个 varchar 列

标签 java hibernate collections enums mapping

在 hibernate 状态下,我需要将枚举集合映射到单个 varchar 列(例如,以逗号分隔的枚举值列表)。

最佳答案

您可以创建一个 Hibernate UserType,您可以在其中将值设置为逗号分隔的字符串:

 public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException {
    try {
        if (null == value) {
            st.setNull(index, Types.VARCHAR);
        } else {
            st.setString(index, toCommaSeparated((Set<Enum>) value));
        }
    } catch (Exception e) {
        throw new HibernateException(String.format("Exception while stringifing '%s'", value), e);
    }

}

private String toCommaSeparated(Set<Enum> inputSet) {
    StringBuilder sb = new StringBuilder();
    String delim = "";
    for (Enum current : inputSet) {
        sb.append(delim).append(current.name());
        delim = ",";
    }
    return sb.toString();
}

然后您将其作为 EnumSet 获取:

    @Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
    String name = rs.getString(names[0]);
    if (rs.wasNull()) {
        return null;
    }

    try {
        Set<Enum<?>> retSet = EnumSet.noneOf(enumClass);
        if (StringUtils.isNotBlank(name)) {
            String[] values = name.split(",");
            for (String value : values) {
                Enum<?> current = getEnumValueFor(value);
                if (current != null) {
                    retSet.add(current);
                }
            }
        }
        return retSet;
    } catch (Exception e) {
        throw new HibernateException("Exception getting object from comma separated string", e);
    }
}

private Enum<?> getEnumValueFor(String name) {
    for (Enum<?> current : enumClass.getEnumConstants()) {
        if (current.name().equals(name)) {
            return current;
        }
    }
    return null;
}

这个实现只是给你一个想法,它当然可以改进或适应你的需要。您还可以找到大量关于如何创建自己的 UserType 并可能使用要存储的 Enum 类对其进行参数化的教程。

关于java - 将枚举集合映射到单个 varchar 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12371101/

相关文章:

java - 具有 Held 和 Karp 算法的旅行商

java - 使用 Spring Boot 时,@PathVariable 参数值包含 '#' 字符后出现问题

java - 试图在表格布局中使表格行的高度相等

java - 根据字符串键中的标记对 JAVA 映射键进行分组

c# - 为什么 IList 不是延迟执行?

java - self 比较接口(interface)在集合类中做什么?

java - 检查数组是否为空而不出现 NullPointerException

java - JPA如何在持久化后从数据库中获取值

hibernate - Grails GORM投影返回的列数少于预期

java - 如何修复命名查询错误(意外标记 : DAY ) in Hibernate?