В моем объекте у меня есть список целых чисел, сохраняемый как String.
@Entity
@Table(name = "example_table")
public class ExampleTable {
private Long exampleTableId;
private List<Integer> exampleInts;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getExampleTableId() {
return exampleTableId;
}
public void setExampleTableId(Long exampleTableId) {
this.exampleTableId = exampleTableId;
}
@Convert(converter = IntegerListConverter.class)
public List<Integer> getExampleInts() {
return exampleInts;
}
public void setExampleInts(List<Integer> exampleInts) {
this.exampleInts = exampleInts;
}
}
Он конвертируется конвертером атрибутов:
@Converter
public class IntegerListConverter implements AttributeConverter<List<Integer>, String> {
private static final String SPLIT_CHAR = ";";
@Override
public String convertToDatabaseColumn(List<Integer> longs) {
return longs == null || longs.isEmpty() ? null : longs.stream()
.map(String::valueOf)
.collect(Collectors.joining(SPLIT_CHAR));
}
@Override
public List<Integer> convertToEntityAttribute(String str) {
return StringUtils.isEmpty(str) ? null :
Stream.of(str.split(SPLIT_CHAR))
.map(Integer::valueOf)
.collect(Collectors.toList());
}
}
Это нормально работает: например, Arrays.asList (1,2,3) сохраняется как «1; 2; 3». Проблема в том, что я пытаюсь найти объект, в котором мой список является параметром запроса, примерно так:
public interface ExampleRepository extends JpaRepository<ExampleTable, Long> {
@Query("SELECT e FROM ExampleRepository e WHERE e.exampleInts = :exampleInts")
Optional<ExampleTable> findOne(List<Integer> exampleInts);
}
Попытка найти его заканчивается: Значение параметра [1] не соответствует ожидаемому type [java .util.List (n / a)] Я также пробовал использовать собственный запрос IN (), но он тоже не работает. Я провел небольшое исследование, но не нашел решения этой проблемы.