休止状態では、列挙型のコレクションを単一の varchar 列にマップする必要があります (たとえば、列挙値のコンマ区切りリストとして)。
質問する
3967 次
2 に答える
2
値をコンマ区切りの文字列として設定するHibernateUserTypeを作成できます。
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クラスでパラメーター化する方法に関するチュートリアルもたくさんあります。
于 2013-01-22T11:31:21.360 に答える
1
データのクエリが不可能になるため、実際にはそうしません。
本当にやりたい場合は、コレクションをセッターの文字列に変換し、文字列を列挙型のコレクションに変換してゲッターに変換します。グアバの場合:
private String fooValues;
public EnumSet<Foo> getFoos() {
EnumSet<Foo> result = EnumSet.noneOf(Foo.class);
for (String fooAsString : Splitter.on(',').split(fooValues)) {
result.add(Foo.valueOf(fooAsString);
}
return result;
}
public void setFoos(EnumSet<Foo> foos) {
this.fooValues = Joiner.on(",").join(foos);
}
于 2012-09-11T13:49:08.090 に答える