Пользовательский запрос Jpa для копирования данных из таблицы в другую таблицу

#spring

#spring

Вопрос:

Я новичок в Jpa. Я хочу скопировать данные из таблицы в другую (курсы в course_confirm). Однако я получаю ответ как от браузера, так и от консоли: сообщение недоступно java.lang.Исключение NullPointerException. Я хотел бы, чтобы кто-нибудь мне помог. Ниже приведены некоторые коды:

  1. Репозиторий:

      public interface MoveCourseRepository extends JpaRepository<CourseCh, Long>{
    
     @Query(nativeQuery = true, value = "SELECT course_code, "
               "credit_unit, dept_id, joint_prerequisite, pass_mark, first_prerequisite, "
               "second_preriquisite, semester, session, course_title, course_type, created_at, "
               "updated_at from courses")
     Set<CourseCh> moveCourseConfirm();
      

    }

  2. класс сущности course_confirm и courses имеют одинаковые поля:

    @Entity

      @Table(name = "course_confirm")
     public class CourseCh extends AuditModel{
    
         private static final long serialVersionUID = 1L;
    
         @Id
         @Column(name = "id")
         @GeneratedValue(strategy = GenerationType.IDENTITY)
         private long id;
    
         @NotEmpty(message = "course code required")
         @Column(name = "course_code")
         private String code;
    
         @NotEmpty(message = "Course title required")
         @Column(name = "course_title")
         private String title;
    
         @NotEmpty(message = "Department required")
         @Column(name = "dept_id")
         private String deptid;
    
         @NotEmpty(message = "Credit units required")
         @Column(name = "credit_unit")
         private String creditunit;
    
         @Column(name = "semester")
         private String semester;
    
         @Column(name = "course_type")
         private String type;
    
         @NotEmpty(message = "Pass mark required")
         @Column(name = "pass_mark")
         private String passmark;
    
         @NotEmpty(message = "Session required")
         @Column(name = "session")
         private String session;
    
         @Column(name = "first_prerequisite")
         private String prerequisite1;
    
         @Column(name = "second_preriquisite")
         private String prerequisite2;
    
         @Column(name = "joint_prerequisite")
         private String jointprerequisite;
     //No argument, all arguments constructor and toString omitted for bravity 
      
  3. Уровень обслуживания:

    общедоступный CourseCh saveCourseConfirm() { Set allDataList = moveCourseRepository.moveCourseConfirm(); CourseCh courseCh = new CourseCh(); для (CourseCh courseChObj : allDataList) { moveCourseRepository.save(courseChObj); courseCh = courseChObj; } возвращает courseCh; }

  4. Способ сохранения в контроллере

    @PostMapping(«/approveCurriculum») общедоступная строка createCourseCh() {

          courseChService.saveCourseConfirm();
         return "redirect:/";
     }
      

Оператор select выполнен успешно, но jpa не удалось сохранить извлеченные данные из course в таблицу course_confirm.

Ответ №1:

Вместо использования set для извлечения всех значений вы можете использовать пользовательский запрос, чтобы решить эту проблему самым простым способом. Просто используйте приведенный ниже запрос и передайте значение id, которое имеет последний вставленный идентификатор, чтобы повторяющиеся значения не использовались снова и снова для вставки.

 insert into course_confirm select * from course where id > 1
  

Комментарии:

1. Спасибо, Мутукумаран, за ваш ответ на мой вопрос. Тем не менее, я хотел бы сообщить вам, что я попробовал ваше предложение, но получил ответ от сервера: «Не удалось преобразовать значение типа ‘java.lang. Строка ‘ в требуемый тип ‘длинная’; вложенным исключением является java.lang.NumberFormatException: для входной строки: «{id}»». Я снова опубликую обновление, которое я внес в приведенный ниже код:

Ответ №2:

Ниже приведено обновление, которое я произвел в вышеупомянутом коде:

  1. Уровень хранилища:

    @Общедоступный интерфейс репозитория MoveCourseRepository расширяет CrudRepository<Курс, длинный>{

      @Query(nativeQuery = true, value = "INSERT into course_confirm SELECT * FROM courses WHERE id > 1")
     List<CourseCh> moveCourseConfirm(long id);
      

    }

  2. Уровень обслуживания:

    @Переопределить общедоступный список saveCourseConfirm(длинный идентификатор) { вернуть moveCourseRepository.moveCourseConfirm(идентификатор); }

  3. Уровень контроллера:

    @PostMapping(«/approveCurriculum/{id}») общедоступная строка createCourseCh(@PathVariable длинный идентификатор, модель модели) { model.AddAttribute(«курс», courseChService.saveCourseConfirm(id)); возвращает «перенаправление:/course»; }

Тем не менее, я получаю ответ сервера: не удалось преобразовать значение типа ‘java.lang.Строка ‘ в требуемый тип ‘long’; вложенным исключением является java.lang.NumberFormatException: для входной строки: «{id}»

Я буду признателен за любой вклад, внесенный в меня.