Какова структура имени метода репозитория JPA для массива типов столбцов? - PullRequest
0 голосов
/ 25 марта 2019

Я использую PostgresSQL в качестве базы данных. В моей таблице nicknames_dictionary есть столбец nicknames с типом данных text[]. Я хочу найти несколько nicknames, находится ли он внутри массива или не использует JPARepository для одного и того же. Поэтому я хочу знать, какое имя метода я должен добавить в JPARepository интерфейсе.

Запрос, который я запускаю на postgres: SELECT * FROM nicknames_dictionary WHERE nicknames = ARRAY['jo'];

Я пытался с именем метода List<NicknamesDictionary> findByNicknamesIn(Collection<String> nicknames);, но он выдал ошибку как java.lang.String cannot be cast to [Ljava.lang.Object;. Заглянул в официальную документацию , но не смог найти структуру для такого запроса.

Класс сущности :

@Entity
@Table(
        name = "nicknames_dictionary"
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class NicknamesDictionaryEntity {

    @Id
    @SequenceGenerator(name="nicknames_id_generator", sequenceName="nicknames_dictionary_id_seq", allocationSize=1)
    @GeneratedValue(generator="nicknames_id_generator")
    private Long id;

    private String name;

    @Type(type = "com.ash.entity.GenericStringArrayUserType")
    @Column(name = "nicknames")
    private String[] nicknames;

    //getters & setters

}

GenericStringArrayUserType.java

public class GenericStringArrayUserType<T extends Serializable> implements UserType {

    protected static final int[] SQL_TYPES = {Types.ARRAY};
    private Class<T> typeParameterClass;

    @Override
    public int[] sqlTypes() {
        return new int[]{Types.ARRAY};
    }

    @Override
    public Class<T> returnedClass() {
        return typeParameterClass;
    }

    @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, SessionImplementor session, Object owner)
            throws HibernateException, SQLException {

        if (resultSet.getArray(names[0]) == null) {
            return new String[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, SessionImplementor session)
            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("text", (Object[]) castObject);
            statement.setArray(index, array);
        }
    }

    @Override
    public Object deepCopy(Object value) throws HibernateException {
        return value;
    }

    @Override
    public boolean isMutable() {
        return true;
    }

    @SuppressWarnings("unchecked")
    @Override
    public Serializable disassemble(Object value) throws HibernateException {
        return (T) this.deepCopy(value);
    }

    @Override
    public Object assemble(Serializable cached, Object owner) throws HibernateException {
        return this.deepCopy(cached);
    }

    @Override
    public Object replace(Object original, Object target, Object owner) throws HibernateException {
        return original;
    }
}

Класс репозитория :

public interface NicknamesDictionaryRepository extends JpaRepository<NicknamesDictionaryEntity, Long> {

    List< NicknamesDictionaryEntity> findByNicknamesIn(Collection<String> nicknames);
}

Дайте мне знать, какой будет правильный синтаксис для имени метода или есть ли другой способ сделать это. (Да, в конце я могу использовать criteriabuilder, если не могу решить его с помощью имени метода)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...