Найти все данные с использованием внешнего ключа из ссылочной таблицы в весенней загрузке jpa

Я выполнил сопоставление jpa one to many между книгой и соответствующими страницами следующим образом.

@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Book {
    @Id
    @EqualsAndHashCode.Include
    @Column(name = "book_id")
    private String bookId;

    private String name;

    @OneToMany(targetEntity = Page.class, cascade= CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "book_id_fk", referencedColumnName = "book_id")
    private List<Page> pages;
}

и

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Page {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer sno;

    private Integer number;
}

@Repository
public interface PageRepository extends JpaRepository<Page, Integer> {
    List<Page> findAllByBook_Id(String bookId);
}

Теперь я хотел бы получить все страницы, используя идентификатор книги из таблицы страниц. Для этого я использую метод findAllBook_id, но получаю исключение No property book found for type Page!. Я пробовал имена методов XXXBook_fkId/XXXBookFkId/XXXBook_fk_id и т. д., но ничего не вышло. Пожалуйста, помогите

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

Ответы 1

Ответ принят как подходящий

Проблема, с которой вы сталкиваетесь, заключается в том, что в вашем entityPage нет поля, связанного с Book. Итак, у вас есть однонаправленное отображение на уровне JPA.

Одним из решений может быть включение следующего пользовательского запроса, который вернет вам то, что вы ожидаете получить.

 @Query( "SELECT pg FROM Book bk join bk.pages pg WHERE bk.bookId = :bookId")
 List<Page> findPagesByBookId(@Param("bookId") String bookId);

Спасибо. Это работает, но есть ли способ добиться того же, используя аннотацию запроса? Я имею в виду, можем ли мы использовать пользовательские методы (которые внутренне генерируют этот запрос)? Пожалуйста, предоставьте свои материалы

Rajeev 04.05.2022 12:44

@Rajeev, тогда вам следует реализовать двунаправленную связь для объекта Page и использовать это как поле в имени метода jpa.

Panagiotis Bougioukos 04.05.2022 12:46

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