web-dev-qa-db-ja.com

エンティティのリストをデータベースの単一の文字列列に変換します

データベースにVARCHARフィールドがあり、このフィールドの値はval1,val2,val3です。

分割区切り文字としてコンマを使用して、これをエンティティのArrayList<String>属性に設定することは可能ですか?

30
Fra83

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

64
Tobias Liefke

はい、これは可能です。

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.TransientStringの2つのフィールドを持つことですが、これらの2つのフィールド間の状態同期をPrePersistPreUpdateリスナー自身で管理します。リスナーの使用例: http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/

5

@ElementCollectionおよび@CollectionTableアノテーションを使用してみてください

0