Запрос автоматически сгенерированной таблицы в Spring Boot

#java #spring #spring-boot #spring-data-jpa

Вопрос:

У меня есть 2 сущности. Один из них-Курсы, а другой-партия

 @Entity @AllArgsConstructor @NoArgsConstructor @Builder @Data public class Course {  @Id  private String uuid;   @Column  private String tileImage;   @Column  private String description;   @Column  private Boolean isActive;   @Column  private String name;   @Column  private String durationWeek;   @Column  private String durationHour;   @Column  private int price;   @Column  private String apply;   @Column  private Integer linkClicked;   @Column  @OneToMany(cascade = CascadeType.ALL)  private Setlt;Batchgt; batches;  }  

И один из них-Пакетный

 @Entity @AllArgsConstructor @NoArgsConstructor @Builder @Data public class Batch {  @Id  private String uuid;   @Column  private Date startDate;   @Column  private Date endDate;   @Column  private String taughtBy; }  

При запуске в Spring boot он генерирует 3 таблицы Курс Партия Courses_batches (coueseuid и BatchUUid)

Проблема в том, что я хочу запросить таблицу Courses_Batches? Как я могу сделать это к весне JPA?

Ответ №1:

Это действительно зависит от желаемого результата: вам , вероятно, не нужен кортеж Course_Batches , представляющий связь между Course и Batch , вы, вероятно, хотите, чтобы все Course совпадало Batches или наоборот.

Эта связь не имеет какого-либо определенного атрибута, и если бы у нее были атрибуты, должна быть промежуточная сущность.

Вы могли бы использовать данные Spring @Query , вариант findBy или a Criteria : здесь я предположил, что вы можете использовать многострочную строку Java для ясности, но вам придется использовать объединение и пространство для более старой версии Java:

 @Query("""  select new com.example.foobar.PairCourseBatch(c, b)  from Course c  left join c.batches b  where c.uuid = :courseUuid  and b.uuid = :batchUuid """) Listlt;PairCourseBatchgt; findAllByCourseIdInJoinTable(  @Param("courseUuid") String courseUuid,  @Param("batchUuid") String batchUuid );  

В PairCourseBatch запросе должен быть полный тип, потому что в противном случае JPA не смог бы его найти. Он ожидает, что конструктор примет course и batch в качестве параметра.

Я не знаю, можете ли вы использовать универсальные методы (например: Pairlt;Course, Batchgt; ), но вы можете вернуть определенный атрибут и создать тип, не являющийся сущностью:

 select new com.example.foobar.PairCourseBatch(c.tileImage, b.startDate, b.endDate)  

Преимущество его использования очищается в типе возвращаемого значения: вам не нужно приводить компонент an Object[] .

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

1. Спасибо за помощь, но на самом деле я использовал собственный запрос, он работал напрямую.

2. Проблема с собственным запросом заключается в том, что вы (на мой взгляд) упускаете смысл JPA. Что произойдет, если вы переименуете таблицу?

Ответ №2:

Данные Spring предоставляют множество способов определения запроса, который мы можем выполнить. Одним из них является @Query аннотация.

Вы также можете использовать собственный SQL для определения нашего запроса. Все, что нам нужно сделать, это установить значение nativeQuery атрибута равным true и определить собственный SQL-запрос в атрибуте value аннотации:

 @Query(value = "SELECT * FROM Courses_Batches cb WHERE cb.course_uuid = ?1",   nativeQuery = true) Object[] findAllByCourseIdInJoinTable(String courseId);  

Вы устанавливаете имена столбцов в соответствии со своей структурой.