Last couple of weeks I have to work with spring boot pet project. This solution for one of the difficulty faced with postgres string array with spring JPA. The problem vs It Always failed to map the domain class array list with postgress text array. This Solution is common for any type of Arrays in postgres database.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | package com.example.mytastyserver.util; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.usertype.UserType; import java.io.Serializable; import java.sql.*; public class GenericArrayUserType<T extends Serializable> implements UserType { protected static final int[] SQL_TYPES = {Types.ARRAY}; private Class<T> typeParameterClass; @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { return this.deepCopy(cached); } @Override public Object deepCopy(Object value) throws HibernateException { return value; } @SuppressWarnings("unchecked") @Override public Serializable disassemble(Object value) throws HibernateException { return (T) this.deepCopy(value); } @Override public boolean equals(Object x, Object y) throws HibernateException { if (x == null) { return y == null; } return x.equals(y); } @Override public int hashCode(Object x) throws HibernateException { return x.hashCode(); } @Override public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException { if (resultSet.wasNull()) { return null; } if (resultSet.getArray(names[0]) == null) { return new Integer[0]; } Array array = resultSet.getArray(names[0]); @SuppressWarnings("unchecked") T javaArray = (T) array.getArray(); return javaArray; } @Override public void nullSafeSet(PreparedStatement statement, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException { Connection connection = statement.getConnection(); if (value == null) { statement.setNull(index, SQL_TYPES[0]); } else { @SuppressWarnings("unchecked") T castObject = (T) value; Array array = connection.createArrayOf("integer", (Object[]) castObject); statement.setArray(index, array); } } @Override public boolean isMutable() { return true; } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { return original; } @Override public Class<T> returnedClass() { return typeParameterClass; } @Override public int[] sqlTypes() { return new int[]{Types.ARRAY}; } } |
Then you can add the type of the entity class.
1 2 | @Type(type = "com.example.mytastyserver.util.GenericArrayUserType") private String[] tags; |
Hope this will helps to resolve your issue. Thanks