Tengo rs.getArray("lang"); que es java.sql.Array y el campo lang es un character varying[] . Quiero convertirlo a List<MyEnumLanguage> . Como ejemplo, tengo {fr_FR,en_US} y he usado el siguiente código para convertir que mi IDE no mostró ningún error
List<MyEnumLanguage> myEnumLanguageList = (List<MyEnumLanguage>) rs.getArray("lang"); pero arroja una excepción org.postgresql.jdbc.PgArray cannot be cast to java.util.List .
Mi MyEnumLanguage es como:
public enum MyEnumLanguage { en_US { public String getCode() { return "en_US" } }, de_DE { public String getCode() { return "de_DE" } }; private MyEnumLanguage() { } }No puede convertir una matriz en List. Su IDE no muestra ningún error porque la conversión ocurre en tiempo de ejecución.
En su lugar, debe usar Arrays.asList(array) , que devuelve una lista que contiene todos los elementos de la matriz. Tenga en cuenta que si desea asignar los elementos de la matriz a otro tipo, puede hacerlo fácilmente con flujos. Ejemplo:
List<MyEnumLanguage> myEnumLanguageList = Arrays.asList(rs.getArray("lang")) .stream() .map(arrayElement -> convertToMyEnumLanguage(arrayElement)) .collect(Collectors.toList()); donde convertToMyEnumLanguage() toma un elemento de su matriz y devuelve el MyEnumLanguage correspondiente.
Echa un vistazo a esta publicación: https://stackify.com/streams-guide-java-8/
ACTUALIZAR
Inicialmente leí mal la pregunta. Primero debe convertir su PgArray en una matriz java normal, antes de poder usarla en Arrays.asList().
Esto se puede hacer usando el método PgArray.getArray() y luego convertir el objeto devuelto en una matriz del tipo contenedor de pgArray.
ACTUALIZAR 2
Ejemplo mejorado:
En primer lugar, debe definir su enumeración de esta manera:
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; } }Luego, para asignar su pgArray a una lista:
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()) ;Tenga en cuenta que la función de mapeo no busca valores nulos. Entonces, si se pasan códigos incorrectos, su lista contendrá valores nulos. Si este no es el resultado deseado, debe realizar las comprobaciones adecuadas y manejar los casos nulos en su función de mapa.