如何将 java.sql.Array 转换为 List<MyCustomEnum>?

ilh*_*han 6 java postgresql spring java-8

我有rs.getArray("lang");哪个 isjava.sql.Array和该lang字段是character varying[]。我想将其转换为List<MyEnumLanguage>. 作为一个例子,我{fr_FR,en_US}已经使用了以下代码进行转换,我的 IDE 没有显示任何错误

List<MyEnumLanguage> myEnumLanguageList = (List<MyEnumLanguage>) rs.getArray("lang");
Run Code Online (Sandbox Code Playgroud)

但它抛出异常org.postgresql.jdbc.PgArray cannot be cast to java.util.List

我的MyEnumLanguage就像:

public enum MyEnumLanguage {
    en_US {
        public String getCode() { return "en_US" }
    },
    de_DE {
        public String getCode() { return "de_DE" }
    };

    private MyEnumLanguage() {
    }
}
Run Code Online (Sandbox Code Playgroud)

ant*_*nis 4

您不能将数组强制转换为 List。您的 IDE 不会显示任何错误,因为转换发生在运行时。

相反,您应该使用Arrays.asList(array)方法,该方法返回一个包含数组所有元素的列表。请注意,如果您想将数组的元素映射到另一种类型,您可以使用流轻松完成此操作。例子:

List<MyEnumLanguage> myEnumLanguageList = Arrays.asList(rs.getArray("lang"))
                .stream()
                .map(arrayElement -> convertToMyEnumLanguage(arrayElement))
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

whereconvertToMyEnumLanguage()获取数组的一个元素并返回相应的MyEnumLanguage.

看看这篇文章: https: //stackify.com/streams-guide-java-8/

更新

最初我读错了这个问题。您必须首先将 PgArray 转换为普通的 java 数组,然后才能在 Arrays.asList() 中使用它。

这可以使用方法来完成PgArray.getArray(),然后将返回的对象转换为 pgArray 包含类型的数组。

更新2

改进示例:

首先,您应该像这样定义枚举:

public enum MyEnumLanguage {

    en_US("en_US"),
    de_DE("de_DE");

    private final String code;

    private MyEnumLanguage(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public static MyEnumLanguage getEnumByCode(String code) {
        if(code == null || code.isEmpty()) {
            return null;
        }
        for(MyEnumLanguage e : values()) {
            if(e.getCode().equals(code)) {
                return e;
            }
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将 pgArray 映射到列表:

Array pgArray = rs.getArray("lang");
String[] langJavaArray = (String[]) pgArray.getArray(); //this returns an Object, so we cast it to a String array

List<MyEnumLanguage> myEnumLanguageList =
        Arrays.stream(langJavaArray)
        .map(MyEnumLanguage::getEnumByCode)
        .collect(Collectors.toList())
;
Run Code Online (Sandbox Code Playgroud)

请注意,映射函数不检查空值。因此,如果传递了错误的代码,您的列表将包含空值。如果这不是所需的结果,您必须执行适当的检查并在地图函数中处理 null 情况。