Я использую 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
, если не могу решить его с помощью имени метода)