JPA:在单个字段中存储整数列表

时间:2012-01-30 14:43:33

标签: java jpa-2.0

是否可以使用标准JPA 2在相应实体表的单个字段中存储整数列表?

类似的东西:

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

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

由于

5 个答案:

答案 0 :(得分:8)

无法在单个字段中存储多个值。是什么原因将它们存储在一个字段中?

一种方法可以是使用String类型的字段,并在逗号分隔列表中添加所有整数,并在getter和setter中加入/爆炸:

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

上的元素集合

此处类似问题Does JPA @ElementCollection annotation always produce an one-to-many relationship?

答案 1 :(得分:1)

也许@Lob可能适合你? (尽管它意味着什么)

@Lob
ArrayList<String> vals;

(请注意,您的集合必须显式为ArrayList)

答案 2 :(得分:1)

您可以将所有val存储在String字段中,用逗号分隔,并更改相关的getter和setter:

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;
}

答案 3 :(得分:1)

您可以创建一个转换器并与@Converter注释一起使用。

此转换器必须实现AttributeConverter,它是具有两个方法convertToDatabaseColumn和convertToEntityAttribute的通用接口。

使用起来非常容易。

答案 4 :(得分:-1)

我认为这不可行。因为您不能在数据库表中有一个允许您存储整数列表的列。

您可以使用字符串类型字段而不是整数列表 -

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

在保存实体之前以及读完实体之后,从整数列表转换为字符串并手动返回。