Как сохранить многомерный массив Java с помощью JPA? - PullRequest
0 голосов
/ 05 апреля 2019

Я хочу преобразовать класс приложения, работающего в памяти, в сущность, чтобы сохранить его, но он содержит поле двойного типа [] []. Я искал, но не нашел, как переписать его, чтобы оно было постоянным.

public class MyClass{

protected int num;

private double[] tab;

private double a[][];

private double b[][];

....
}

1 Ответ

0 голосов
/ 05 апреля 2019

Если вам это нужно для PostgreSQL (одной из немногих баз данных, которые поддерживают массивы SQL), вы можете попробовать и использовать пользовательские конвертеры.Как показано в этом примере, https://thoughts -on-java.org / jpa-21-how-to-Implement-type-converter /

Алгоритм преобразования в строковый форматследующее:

public String convertToDatabaseColumn(double[][] arr) {
    if (arr == null) {
        return null;
    }
    // verify array
    int len1 = arr.length;
    int len2 = -1;
    for (double[] ar : arr) {
        Objects.requireNonNull(ar);
        if (len2 == -1) {
            // first iteration only, if non-empty
            len2 = ar.length;
        }
        else {
            if (len2 != ar.length) {
                throw new RuntimeException("PostgreSQL multidimensional arrays require same lengths on every level");
            }
        }
    }
    StringBuilder sb = new StringBuilder();
    sb.append('{');
    for (double[] ar : arr) {
        sb.append('{');
        for (double a : ar) {
            sb.append(a).append(',');
        }
        sb.setLength(sb.length()-1);
        sb.append("},");
    }
    sb.setLength(sb.length()-1);
    sb.append('}');
    return sb.toString();
}

Вы должны быть в состоянии сделать алгоритм их чтения, когда вы знаете эту часть.Только не полагайтесь на split или регулярные выражения, и вы, вероятно, можете пропустить проверку.

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

Если вам это нужно для другого типа базы данных, котораяне поддерживает массивы, вы можете просто сохранить его как текст, используя пользовательский формат, или даже просто преобразовать JSON с помощью преобразователей атрибутов.

...