如何使用JPA持久化多维Java数组?

时间:2019-04-05 00:33:18

标签: java hibernate jpa spring-data-jpa persistence

我想将在内存中工作的应用程序的类转换为实体,以使其持久化,但是它包含双精度类型字段[] []。我进行了搜索,但没有找到如何将其重写以保持持久性的方法。

public class MyClass{

protected int num;

private double[] tab;

private double a[][];

private double b[][];

....
}

1 个答案:

答案 0 :(得分:0)

如果您需要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或正则表达式,您可能可以跳过验证。

这不包括需要特殊转义的字符串数组,某些情况下用双引号引起来。该算法在任何地方都没有正确描述,您必须在服务器的源代码中找到它。您可以在我的模块中here来尝试实现它,该模块允许您使用许多非基本类型的一维数组。

如果您需要另一种不支持数组的数据库,则可以使用自定义格式将其保存为文本,甚至可以使用属性转换器将其保存为简单的JSON转换。

相关问题