web-dev-qa-db-ja.com

JPA:整数のリストを単一のフィールドに格納します

標準のJPA2を使用して、それぞれのエンティティテーブルの単一のフィールドに整数のリストを格納することは可能ですか?

@Entity
@Table(name="tbl_myentities")
public class MyEntity {

@ElementaryCollection
@Column(name="vals") // in table tbl_myentities
private List<Integer> vals;
17
Michael

1つのフィールドに複数の値を格納することはできません。それらを単一のフィールドに保存する理由は何ですか?

文字列型のフィールドを使用し、そこにあるすべての整数をコンマ区切りのリストに追加し、ゲッターとセッターで結合/分解する方法があります。

private String vals;

public setVals(int vals[])
{
     // this.vals = Iterate vals[] and create a comma separated string
}

public int[] getVals()
{
    // vals.split(",") to get a list of Strings, then typecast/parse them to ints before returning
}

@ElementCollectionアノテーションと@CollectionTableを使用してマッピングを制御するには、に値を格納するための別個のテーブルが必要です。

@ElementCollection
private Collection<Integer> integers;

要素コレクションの詳細については、 http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection を参照してください。

ここで同様の質問 JPA @ElementCollectionアノテーションは常に1対多の関係を生成しますか?

12
MrKiane

コンバーターを作成して、アノテーション@Converterとともに使用できます。

このコンバーターは、convertToDatabaseColumnメソッドとconvertToEntityAttributeメソッドの2つのメソッドを持つ汎用インターフェイスであるAttributeConverterを実装する必要があります。

作業は非常に簡単です。ここで確認できます: jpaに依存しないカスタムタイプマッピング/ org.hibernate.annotations.Typeおよびorg.hibernate.annotations.TypeDefの代替のjavax.persistence.x

3
g__n

すべての値をコンマで区切って文字列フィールドに格納し、関連するゲッターとセッターを次のように変更できます。

public List<Integer> getVals() {
    List<Integer> lstVals = new ArrayList<Integer>();
    int val = 0;

    for(String field : this.vals.split(",")) {
        try {
            val = Integer.parseInt(field);
        }
        // If the String contains other thing that digits and commas
        catch (NumberFormatException e) {
        }
        lstVals.add(val);
    }

    return lstVals;
}

public void setVals(List<Integer> vals) {
    String newVals = "";
    for(int i : vals) {
        newVals.concat(String.valueOf(i));
    }
    this.vals = newVals;
}
2
veben

それは不可能だと思います。整数のリストを格納できる列をデータベーステーブルに含めることができないためです。

あなたができることは、整数のリストの代わりに文字列型フィールドを使用することです-

@Column(name="vals") // in table tbl_myentities
private String vals;

また、整数のリストから文字列に変換し、エンティティを保存する前とエンティティを読み取った後に手動で元に戻します。

0
Bhesh Gurung

たぶん@Lobがあなたに合うかもしれませんか? (それが意味するものにもかかわらず)

@Lob
ArrayList<String> vals;

(コレクションは明示的にArrayListでなければならないことに注意してください)

0
Victor Petit