Репозиторий JPA и конструктор с varargs

В @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 нет этой функции?

Почему бы не перегрузить конструктор? или использовать список в качестве параметра?

lucsbelt 22.04.2018 01:21

Как бы вы использовали список в JPQL? Потому что я не знаю, как нанести на карту что-то подобное. Внутренний конструктор списка в EntityDTO в @Query не работает. Да. Я знаю, что мог бы использовать перегруженный конструктор, но у меня было бы что-то около 14 конструкторов.

Caroline 22.04.2018 10:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
898
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Боюсь, это невозможно.

Способ, которым Hibernate реализует разрешение конструктора сопоставления, только конструкторы с точно таким же количеством аргументов, как количество параметров, переданных в выражение конструктора, считаются потенциальными совпадениями.

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

Другие вопросы по теме