Можно ли хранить список целых чисел в одном поле соответствующей таблицы сущностей со стандартным JPA 2?
@Entity
@Table(name="tbl_myentities")
public class MyEntity {
@ElementaryCollection
@Column(name="vals") // in table tbl_myentities
private List<Integer> vals;
Невозможно хранить несколько значений в одном поле. В чем причина их хранения в одном поле?
Способ может состоять в том, чтобы использовать поле типа String и добавить туда все целые числа в список, разделенный запятыми, и объединить/взорвать геттеры и сеттеры:
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 для управления сопоставлениями требует отдельной таблицы для хранения значений.
Вы можете создать конвертер и использовать его с аннотацией @Converter.
Этот преобразователь должен реализовать AttributeConverter, который является универсальным интерфейсом с двумя методами convertToDatabaseColumn и convertToEntityAttribute.
С ним довольно легко работать, вы можете проверить здесь: org-hib/24194996#24194996">jpa независимое сопоставление настраиваемых типов / javax.persistence.x альтернатива org.hibernate.annotations.Type и org.hibernate.annotations.TypeDef
Ответ 3 · рейтинг 3 · veben
Вы можете хранить все значения в поле String, разделенные запятой, и изменять связанные геттеры и сеттеры следующим образом:
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;
}
Ответ 4 · Bhesh Gurung
Я не думаю, что это возможно. Потому что у вас не может быть столбца в таблице базы данных, который позволяет хранить список целых чисел.
Что вы можете сделать, так это использовать поле типа строки вместо списка целых чисел -
@Column(name="vals") // in table tbl_myentities
private String vals;
И выполните преобразование в строку из списка целых чисел и обратно вручную, прежде чем сохранить свою сущность и после того, как вы прочитали свою сущность.
Ответ 5 · Victor Petit
Может быть, вам подойдет @Lob? (несмотря на то, что это означает)
@Lob
ArrayList<String> vals;
(обратите внимание, что ваша коллекция должна быть явно ArrayList)