JPA: хранить список целых чисел в одном поле

Можно ли хранить список целых чисел в одном поле соответствующей таблицы сущностей со стандартным JPA 2?

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

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

person Michael    schedule 30.01.2012    source источник


Ответы (5)


Невозможно хранить несколько значений в одном поле. В чем причина их хранения в одном поле?

Способ может состоять в том, чтобы использовать поле типа 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 для управления сопоставлениями требует отдельной таблицы для хранения значений.

@ElementCollection
private Collection<Integer> integers;

Подробнее о коллекциях элементов читайте на http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection< /а>

Аналогичный вопрос здесь Всегда ли аннотация JPA @ElementCollection создает отношение "один ко многим"?

person MrKiane    schedule 30.01.2012
comment
В нем говорится: значения ElementCollection всегда хранятся в отдельной таблице. - person Bhesh Gurung; 30.01.2012
comment
Я не думаю, что это то, чего хотел ОП. - person Kent; 30.01.2012

Вы можете создать конвертер и использовать его с аннотацией @Converter.

Этот преобразователь должен реализовать AttributeConverter, который является универсальным интерфейсом с двумя методами convertToDatabaseColumn и convertToEntityAttribute.

С ним довольно легко работать, вы можете проверить здесь: org-hib/24194996#24194996">jpa независимое сопоставление настраиваемых типов / javax.persistence.x альтернатива org.hibernate.annotations.Type и org.hibernate.annotations.TypeDef

person g__n    schedule 27.11.2018

Вы можете хранить все значения в поле 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;
}
person veben    schedule 06.10.2017

Я не думаю, что это возможно. Потому что у вас не может быть столбца в таблице базы данных, который позволяет хранить список целых чисел.

Что вы можете сделать, так это использовать поле типа строки вместо списка целых чисел -

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

И выполните преобразование в строку из списка целых чисел и обратно вручную, прежде чем сохранить свою сущность и после того, как вы прочитали свою сущность.

person Bhesh Gurung    schedule 30.01.2012

Может быть, вам подойдет @Lob? (несмотря на то, что это означает)

@Lob
ArrayList<String> vals;

(обратите внимание, что ваша коллекция должна быть явно ArrayList)

person Victor Petit    schedule 05.07.2017
comment
@Wingie Ваш геттер / сеттер также явно предназначен для ArrayList? - person Victor Petit; 15.01.2018
comment
При этом возникает следующая ошибка: class=java.lang.ClassCastException, error=java.util.ArrayList cannot be cast to java.sql.Blob Не думаю, что это решение работает. - person user7171758; 01.10.2019