是否可以使用标准JPA 2在相应实体表的单个字段中存储整数列表?
类似的东西:
@Entity
@Table(name="tbl_myentities")
public class MyEntity {
@ElementaryCollection
@Column(name="vals") // in table tbl_myentities
private List<Integer> vals;
由于
答案 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;
在保存实体之前以及读完实体之后,从整数列表转换为字符串并手动返回。