Я использую 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);
}
Я добавил код контроллера
Похоже, это не имеет ничего общего с JPQL. Метод не работает при работе с методом вашего контроллера, аннотированным с помощью ModelAttribute (ModelAttributeMethodProcessor)
Я забыл добавить @RequestParam в класс контроллера
получилось или нет с добавлением @requestParam?
да, он работал, добавляя @RequestParam , но только когда я добавляю одно значение in nRoomIdList Когда я добавляю еще одно значение в nRoomIdList, я получаю сообщение об ошибке «Не удалось преобразовать значение типа 'java.lang.String []' в требуемый тип 'java .util.List '; `
Ваша весенняя версия до 3.0? Пожалуйста, попробуйте использовать @RequestParam Integer[] nRoomIdList вместо List. И измените его на список перед отправкой в roomService.
когда я проверяю результат в чванстве, я получаю ожидаемый результат. но используя те же входные параметры, когда я проверяю результат через почтальона, я получаю `[]`




Измените свой код @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) {
...
}
Список nRoomIdList, поступающий из пользовательского интерфейса? Если вы используете контроллер отдыха, можете ли вы добавить его код;