В @Query можно использовать конструктор varargs (org.springframework.data.jpa.repository). Я имею в виду такой класс:
public class EntityDTO {
public EntityDTO(Long id, LocalDate... dates) {
// some code here where dates
//which are converted to List<Pair<LocalDate, LocalDate> datesList
}
}
public interface CustomRepository extends JpaRepository<Entity, Long> {
@Query("SELECT new package.path.EntityDTO(id, date1, date2, date2) FROM Entity")
List<EntityDTO> findEntityList();
}
Теперь возникает такая ошибка:
Unsatisfied dependency expressed through constructor parameter 3
Validation failed for query for method public abstract java.util.List CustomRepository.findEntityList(java.lang.Long,java.time.LocalDate,java.time.LocalDate)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException:
Unable to locate appropriate constructor on class [EntityDTO]. Expected arguments are: long, java.time.LocalDate, java.time.LocalDate, java.time.LocalDate, java.time.LocalDate
Это всего лишь пример запроса, потому что в конструкторе dto может иметь параметр id и LocalDate от 2 до 12-14, даты могут быть из разных таблиц (сущностей). Это зависит от запроса. Для этой цели мне нужен более общий класс. Запрос намного сложнее, чем в этом примере, но меня интересует какой-то конструктор, который дает мне возможность создать что-то похожее на то, что я описал в конструкторе EntityDTO в комментарии. Можно ли использовать varargs в @Query?
Редактировать: Есть ли у вас какие-либо предложения, что я могу использовать, если у JPQL нет этой функции?
Как бы вы использовали список в JPQL? Потому что я не знаю, как нанести на карту что-то подобное. Внутренний конструктор списка в EntityDTO в @Query не работает. Да. Я знаю, что мог бы использовать перегруженный конструктор, но у меня было бы что-то около 14 конструкторов.




Боюсь, это невозможно.
Способ, которым Hibernate реализует разрешение конструктора сопоставления, только конструкторы с точно таким же количеством аргументов, как количество параметров, переданных в выражение конструктора, считаются потенциальными совпадениями.
Обходной путь мог - создать конструктор, который принимает список, а затем изменить ваш запрос на что-то вроде SELECT NEW EntityDTO(id, NEW list(date1, date2, date2)) ... если поддерживаются только вложенные выражения NEW. К сожалению, это давний запрос функции.
Почему бы не перегрузить конструктор? или использовать список в качестве параметра?