22

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

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

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

5 回答 5

17

不能在单个字段中存储多个值。将它们存储在单个字段中的原因是什么?

一种方法是使用 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上阅读有关元素集合的更多信息

类似的问题JPA @ElementCollection 注释是否总是产生一对多的关系?

于 2012-01-30T14:49:07.180 回答
4

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

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

It is pretty easy to work with, you can check here: jpa independent custom type mapping / javax.persistence.x alternative to org.hibernate.annotations.Type and org.hibernate.annotations.TypeDef

于 2018-11-27T12:18:49.533 回答
3

您可以将所有 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;
}
于 2017-10-06T06:48:35.180 回答
0

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

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

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

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

于 2012-01-30T14:53:36.553 回答
0

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

@Lob
ArrayList<String> vals;

(请注意,您的集合必须是明确的 ArrayList)

于 2017-07-05T12:41:24.617 回答