データベースにVARCHAR
フィールドがあり、このフィールドの値はval1,val2,val3
です。
分割区切り文字としてコンマを使用して、これをエンティティのArrayList<String>
属性に設定することは可能ですか?
JPA 2.1を使用している場合は、AttributeConverter
を作成できます。
@Converter
public class StringListConverter implements AttributeConverter<List<String>, String> {
@Override
public String convertToDatabaseColumn(List<String> list) {
// Java 8
return String.join(",", list);
// Guava
return Joiner.on(',').join(list);
}
@Override
public List<String> convertToEntityAttribute(String joined) {
return new ArrayList<>(Arrays.asList(joined.split(",")));
}
}
エンティティでこのコンバーターを使用できます。
@Column
@Convert(converter = StringListConverter.class)
private List<String> strings;
JPA 2.1より前の場合は、これを手動で行うことができました。
@Entity
private MyEntity {
...
private String strings;
public List<String> getStrings() {
return Arrays.asList(strings.split(","));
}
public void setStrings(List<String> list) {
strings = String.join(",", list);
}
}
Arrays.asList
をコンバーターのArrayList
でラップします。結果は属性に格納され、そのリストへの変更はデータベースに書き戻されるため、変更可能なリストが必要です(できる'Arrays.asList
)の結果には何も追加しません。 2.1以前ソリューションでは、結果は属性に関連付けられておらず、変更可能なリストは属性と同期されません。
そのような属性に特定のアイテムを含むエンティティを照会するには、私の答えを参照してください here
はい、これは可能です。
Hibernate 4.3.x +では、AttributeConverter
を定義できますが、List
型のため、これは初期のHibernateバージョンでは機能しないと確信しています。例については、これを参照してください: http://www.thoughts-on-Java.org/jpa-21-how-to-implement-type-converter/
これを機能させるもう1つの方法は、カスタムUserType
を実装し、フィールド/ゲッターにorg.hibernate.annotations.Type
で注釈を付けることです。以下に、例を挙げてこれを説明します。 http://blog.xebia.com/understanding-and-writing-hibernate-user-types/
JPAと互換性のあるもう1つの方法は、List
アノテーションがjavax.persistence.Transient
とString
の2つのフィールドを持つことですが、これらの2つのフィールド間の状態同期をPrePersist
とPreUpdate
リスナー自身で管理します。リスナーの使用例: http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/
@ElementCollectionおよび@CollectionTableアノテーションを使用してみてください