Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: MichaelОтветов: 5

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

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

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

spring-bootjava

Ответы

Ответ 1 · рейтинг 17 · MrKiane

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

Способ может состоять в том, чтобы использовать поле типа 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 создает отношение "один ко многим"?

Ответ 2 · рейтинг 4 · g__n

Вы можете создать конвертер и использовать его с аннотацией @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)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы