Тест на членство в массиве Postgres - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть столбец (например, «псевдонимы») в одной из моих таблиц базы данных Postgres («персона»), который объявлен как текстовый массив (text []). Я могу получить значения из столбца в порядке с пользовательским классом (StringList), который реализует интерфейс UserType hibernate. Вот мой класс сущности

@Entity
@Table(name = "person")
public class Person {
    ...

    @Column(columnDefinition = "text[]")
    @Type(type = "com.me.type.StringList")
    private List<String> nicknames;
}

Как я могу получить сущности Person, содержащие заданный псевдоним? Я пытаюсь использовать Spring JPA Query следующим образом:

@Query("SELECT p FROM Person p WHERE ...)")
List<Person> findPersonsWithNickname(String nickname );

Каждая попытка выполнить запрос давала мне исключение во время выполнения, и когда я размещаю точки останова в моем StringList, они не получают попадания для этого запроса.

Вот как определяется StringList:

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.usertype.UserType;

import java.io.Serializable;
import java.sql.Array;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class StringList implements UserType {
    private final int[] arrayTypes = new int[]{Types.ARRAY};

    public int[] sqlTypes() {
        return arrayTypes;
    }

    public Class<List> returnedClass() {
        return List.class;
    }

    public boolean equals(Object x, Object y) throws HibernateException {
        return x == null ? y == null : x.equals(y);
    }

    public int hashCode(Object x) throws HibernateException {
        return x == null ? 0 : x.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner)
        throws HibernateException, SQLException {
        if (names != null && names.length > 0 && rs != null && rs.getArray(names[0]) != null) {
            Object array = rs.getArray(names[0]).getArray();
            if (array instanceof String[])
                return Arrays.asList((String[]) array);
            else
                return Arrays.asList();
        }

        return null;
    }

    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session)
        throws HibernateException, SQLException {
        if (value != null && st != null) {
            List<String> list = (List<String>) value;
            String[] castObject = list.toArray(new String[list.size()]);
            Array array = session.connection().createArrayOf("text", castObject);
            st.setArray(index, array);
        } else {
            st.setNull(index, arrayTypes[0]);
        }
    }

    public Object deepCopy(Object value) throws HibernateException {
        if (value == null)
            return null;

        List<String> list = (List<String>) value;
        ArrayList<String> clone = new ArrayList<String>();
        for (Object stringValue : list)
            clone.add((String) stringValue);

        return clone;
    }

    public boolean isMutable() {
        return false;
    }

    public Serializable disassemble(Object value) throws HibernateException {
        return (Serializable) value;
    }

    public Object assemble(Serializable cached, Object owner) throws HibernateException {
        return cached;
    }

    public Object replace(Object original, Object target, Object owner) throws HibernateException {
        return original;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...