gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:02 24 4
gpt4 key购买 nike

在 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/

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