#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);
Вы устанавливаете имена столбцов в соответствии со своей структурой.