Данные Spring JPA: java.lang.NoSuchMethodException: java.util.List. <init> ()

Я использую Spring Data JPA для создания сервисов. Я пытаюсь использовать IN clause в запросе JPQL.

На самом деле я пытаюсь преобразовать этот запрос LinQ в JPQL

Запрос LinQ

from rooms in EspaceDB.Rooms
                            where roomIDList.Contains(rooms.nRoomID.ToString())
                            select rooms;

java.lang.NoSuchMethodException: userAuth.User. <init> ()

Это решение не сработало для меня. Во всех моих модельных классах у меня есть конструктор по умолчанию.

Синтаксис запроса JPQL

@Query("select room from Room as room where room.nRoomId In (:nRoomIdList)")    
    List<Room> recoverDeletedRoom(@Param(value = "nRoomIdList") List<Integer> nRoomIdList);

Консоль

java.lang.NoSuchMethodException: java.util.List.<init>()
    at java.lang.Class.getConstructor0(Unknown Source) ~[na:1.8.0_144]
    at java.lang.Class.getDeclaredConstructor(Unknown Source) ~[na:1.8.0_144]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:209) ~[spring-web-5.0.7.RELEASE.jar:5.0.7.RELEASE]

    at java.lang.Thread.run(Unknown Source) [na:1.8.0_144]

Класс помещения

@Entity
@Table(name = "room")
public class Room implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "room_seq_generator")
    @SequenceGenerator(name = "room_seq_generator", sequenceName = "room_seq",allocationSize=1)
    @Column(name = "nroom_id", columnDefinition = "serial")   
    public Integer nRoomId;

    @Column(name = "ncampus_id")
    public Integer nCampusId;

     //....
     //....

     public Room() {
        super();
    }

Комнатный контроллер

@PutMapping("/recoverDeletedRoom")
    public List<Room> recoverRoom(List<Integer> nRoomIdList, Boolean IsActive) {
        return roomService.recoverDeletedRoom(nRoomIdList, IsActive);
    }

Список nRoomIdList, поступающий из пользовательского интерфейса? Если вы используете контроллер отдыха, можете ли вы добавить его код;

drowny 03.10.2018 16:50

Я добавил код контроллера

SpringUser 03.10.2018 16:52

Похоже, это не имеет ничего общего с JPQL. Метод не работает при работе с методом вашего контроллера, аннотированным с помощью ModelAttribute (ModelAttributeMethodProcessor)

JB Nizet 03.10.2018 16:58

Я забыл добавить @RequestParam в класс контроллера

SpringUser 03.10.2018 17:05

получилось или нет с добавлением @requestParam?

drowny 03.10.2018 17:07

да, он работал, добавляя @RequestParam , но только когда я добавляю одно значение in nRoomIdList Когда я добавляю еще одно значение в nRoomIdList, я получаю сообщение об ошибке «Не удалось преобразовать значение типа 'java.lang.String []' в требуемый тип 'java .util.List '; `

SpringUser 03.10.2018 17:12

Ваша весенняя версия до 3.0? Пожалуйста, попробуйте использовать @RequestParam Integer[] nRoomIdList вместо List. И измените его на список перед отправкой в ​​roomService.

drowny 03.10.2018 17:25

когда я проверяю результат в чванстве, я получаю ожидаемый результат. но используя те же входные параметры, когда я проверяю результат через почтальона, я получаю `[]`

SpringUser 04.10.2018 09:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
6 497
2

Ответы 2

Измените свой код @PutMapping

@PutMapping("/recoverDeletedRoom")
public List<Room> recoverRoom(@RequestBody WrapperObject wrapperObject) {
   return roomService.recoverDeletedRoom(wrapperObject.getNRoomIdList(), getIsActive());
}

И поставим отображение тела;

public class WrapperObject {

    List<Integer> nRoomIdList;
    Boolean isActive;

    //getters setters
}

Вы получите это исключение, если ваши параметры не имеют аннотации @RequestBody.

Аннотация @RequestBody разрешена только для параметра один, который получает все тело запроса.

Итак, в вашем случае вам нужен объект-оболочка.

@PutMapping("/recoverDeletedRoom")
    public List<Room> recoverRoom(@RequestBody YourWrapperObject wrapper) {
        ...
    }

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